<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>类 &#8211; 个人随笔</title>
	<atom:link href="/label/%E7%B1%BB/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sun, 20 May 2018 01:23:47 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>类 &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>面向对象（一）$This、 子类、 实例化、 对象、 封装、 属性操作、 构造函数、 析构函数、 父类、 类、 继承、 访问修饰符</title>
		<link>/php/1789.html</link>
					<comments>/php/1789.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 18 May 2018 13:04:34 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[面向对象]]></category>
		<category><![CDATA[面向对象编程]]></category>
		<category><![CDATA[$This]]></category>
		<category><![CDATA[子类]]></category>
		<category><![CDATA[实例化]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[封装]]></category>
		<category><![CDATA[属性操作]]></category>
		<category><![CDATA[构造函数]]></category>
		<category><![CDATA[析构函数]]></category>
		<category><![CDATA[父类]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[继承]]></category>
		<category><![CDATA[访问修饰符]]></category>
		<guid isPermaLink="false">/?p=1789</guid>

					<description><![CDATA[面向对象（一） 常见的编程思想 面向过程思想 通过程序的执行顺序为主线开发代码 优点：简单，易学，上手快。 缺 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>面向对象（一）</h1>
<h2>常见的编程思想</h2>
<h3>面向过程思想</h3>
<p>
  通过程序的执行顺序为主线开发代码
</p>
<p>
  优点：简单，易学，上手快。
</p>
<p>
  缺点：多人合作不方便
</p>
<h3>面向对象思想</h3>
<p>
  以组成项目的对象为主线进行开发。在面向对象的思想里面，所有的事物都看成对象。
</p>
<p>
  优点：多人合作方便，代码冗余很少
</p>
<p>
  缺点：学起来比面向过程复杂。
</p>
<h2>面向对象简介</h2>
<p>
  OOP：面向对象编程（Object Oriented Programming），OOP，面向对象编程
</p>
<p>
  OOAD：OOA和OOD
</p>
<p>
  OOA: 面向对象分析(Object-Oriented Analysis,OOA)
</p>
<p>
  OOD: 面向对象设计（Object-Oriented Design，OOD）
</p>
<h3>对象</h3>
<p>
  对象是由属性和方法组成的
</p>
<p>
  属性的本质就是变量
</p>
<p>
  方法的本质就是函数
</p>
<p><img fetchpriority="high" decoding="async" width="666" height="269" src="/wp-content/uploads/2018/05/word-image-1568.png" class="wp-image-1791" srcset="/wp-content/uploads/2018/05/word-image-1568.png 666w, /wp-content/uploads/2018/05/word-image-1568-300x121.png 300w" sizes="(max-width: 666px) 100vw, 666px" /></p>
<h3>类</h3>
<p>
  类是所有对象共同的属性和方法的组合。
</p>
<p>
  我们在开发时候是通过调用对象的方法或属性来实现某个效果，要调用方法必须先有对象，要想有对象必须先有类。
</p>
<p>
  开发顺序：类——（实例化）对象——调用对象的方法和属性。
</p>
<h3>类和对象的关系</h3>
<p>
  通过类可以创建多个对象，类就类似于模具，一个模具制造很多形状一致的对象。
</p>
<p><img decoding="async" width="456" height="304" src="/wp-content/uploads/2018/05/word-image-1569.png" class="wp-image-1792" srcset="/wp-content/uploads/2018/05/word-image-1569.png 456w, /wp-content/uploads/2018/05/word-image-1569-300x200.png 300w" sizes="(max-width: 456px) 100vw, 456px" /></p>
<h3>类是有父类和子类之分的</h3>
<p><img decoding="async" width="692" height="245" src="/wp-content/uploads/2018/05/word-image-1570.png" class="wp-image-1793" srcset="/wp-content/uploads/2018/05/word-image-1570.png 692w, /wp-content/uploads/2018/05/word-image-1570-300x106.png 300w" sizes="(max-width: 692px) 100vw, 692px" /></p>
<p>
  再比如：老师是类，语文老师也是类，老师是父类，语文老师是子类。
</p>
<h2>在PHP中实现类</h2>
<h3>语法</h3>
<p>
  class 类名{
</p>
<p>
  	//属性
</p>
<p>
  	//方法
</p>
<p>
  	//常量
</p>
<p>
  }
</p>
<h3>类名的命名规则</h3>
<ol>
<li>
  以字母、下划线开头，后面跟的是字母、数字、下划线
</li>
<li>
  一般用帕斯卡命名法
</li>
<li>
  不能用PHP关键字做类名
</li>
<li>
  类名不区分大小写
</li>
</ol>
<h3>实例化对象</h3>
<p>
  实例化：创造实例（对象）的过程
</p>
<p>
  通过new关键字实例化
</p>
<p>
  $对象名=new 类名()
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="542" height="248" src="/wp-content/uploads/2018/05/word-image-1571.png" class="wp-image-1794" srcset="/wp-content/uploads/2018/05/word-image-1571.png 542w, /wp-content/uploads/2018/05/word-image-1571-300x137.png 300w" sizes="(max-width: 542px) 100vw, 542px" /></p>
<h2>对象的传递</h2>
<p>
  对象的传递的地址传递
</p>
<p><img loading="lazy" decoding="async" width="839" height="206" src="/wp-content/uploads/2018/05/word-image-1572.png" class="wp-image-1795" srcset="/wp-content/uploads/2018/05/word-image-1572.png 839w, /wp-content/uploads/2018/05/word-image-1572-300x74.png 300w, /wp-content/uploads/2018/05/word-image-1572-768x189.png 768w" sizes="(max-width: 839px) 100vw, 839px" /></p>
<h2>操作属性</h2>
<p>
  对象调用属性和方法使用“-&gt;”，
</p>
<p>
  语法：
</p>
<p>
  对象名-&gt;属性
</p>
<p>
  对象名-&gt;方法名()
</p>
<p>
  &lt;?php
</p>
<p>
  //类
</p>
<p>
  class Student {
</p>
<p>
  	public $name;	     //语法结构：访问修饰符+变量名
</p>
<p>
  }
</p>
<p>
  //实例化
</p>
<p>
  $stu1=new Student;						//类名后不加()也可以
</p>
<p>
  $stu2=new Student();					//类名后加()也可以
</p>
<p>
  $stu1-&gt;name=&#8217;tom&#8217;;						//操作1、给属性赋值
</p>
<p>
  echo $stu1-&gt;name,'&lt;br&gt;&#8217;;	//tom		//操作2、显示属性的值
</p>
<p>
  $stu1-&gt;add=&#8217;beijing&#8217;;					//操作3、给stu1对象添加add属性
</p>
<p>
  unset($stu2-&gt;name);						//操作4、删除stu2对象的name属性
</p>
<p>
  var_dump(isset($stu1-&gt;name));//bool(true) 	//操作5：判断属性是否存在
</p>
<h2>定义方法</h2>
<p>
  语法结构
</p>
<p>
  访问修饰符 function 方法名(参数){
</p>
<p>
  	//方法体
</p>
<p>
  }
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="567" height="214" src="/wp-content/uploads/2018/05/word-image-1573.png" class="wp-image-1796" srcset="/wp-content/uploads/2018/05/word-image-1573.png 567w, /wp-content/uploads/2018/05/word-image-1573-300x113.png 300w" sizes="(max-width: 567px) 100vw, 567px" /></p>
<h2>对象的比较</h2>
<p>
  全等：指向同一个对象是全等
</p>
<p>
  相等：只要属于同一个类，结构和属性值都一致才相等
</p>
<p><img loading="lazy" decoding="async" width="777" height="345" src="/wp-content/uploads/2018/05/word-image-1574.png" class="wp-image-1797" srcset="/wp-content/uploads/2018/05/word-image-1574.png 777w, /wp-content/uploads/2018/05/word-image-1574-300x133.png 300w, /wp-content/uploads/2018/05/word-image-1574-768x341.png 768w" sizes="(max-width: 777px) 100vw, 777px" /><br />
<img loading="lazy" decoding="async" width="724" height="381" src="/wp-content/uploads/2018/05/word-image-1575.png" class="wp-image-1798" srcset="/wp-content/uploads/2018/05/word-image-1575.png 724w, /wp-content/uploads/2018/05/word-image-1575-300x158.png 300w" sizes="(max-width: 724px) 100vw, 724px" /></p>
<h2>访问修饰符</h2>
<p>
  用来修饰属性和方法，控制属性和方法的权限
</p>
<table>
<tr>
<td>
<p>
  访问修饰符
</p>
</td>
<td>
<p>
  描述
</p>
</td>
</tr>
<tr>
<td>
<p>
   Public（公有的）
</p>
</td>
<td>
<p>
  在类的内部和外部都能访问
</p>
</td>
</tr>
<tr>
<td>
<p>
   private（私有的）
</p>
</td>
<td>
<p>
  只能在类的内部访问
</p>
</td>
</tr>
<tr>
<td>
<p>
  protected（受保护的）
</p>
</td>
<td>
<p>
  在整个继承链上访问
</p>
</td>
</tr>
</table>
<p>
  例题一
</p>
<p><img loading="lazy" decoding="async" width="1080" height="240" src="/wp-content/uploads/2018/05/word-image-1576.png" class="wp-image-1799" srcset="/wp-content/uploads/2018/05/word-image-1576.png 1080w, /wp-content/uploads/2018/05/word-image-1576-300x67.png 300w, /wp-content/uploads/2018/05/word-image-1576-768x171.png 768w, /wp-content/uploads/2018/05/word-image-1576-1024x228.png 1024w" sizes="(max-width: 1080px) 100vw, 1080px" /></p>
<p>
  脚下留心：一般来说，属性都是私有的，通过公有的方法对私有的属性进行赋值和取值。这样做可以在方法中对数据进行过滤，提高数据安全性。
</p>
<p>
  &lt;?php
</p>
<p>
  class Student {
</p>
<p>
  	public $name;	//私有属性
</p>
<p>
  	public $sex;	//私有属性
</p>
<p>
  	//通过公有的方法进行赋值
</p>
<p>
  	public function setInfo($name,$sex) {
</p>
<p>
  		if($sex!=&#8217;男&#8217; &amp;&amp; $sex!=&#8217;女&#8217;){
</p>
<p>
  			echo &#8216;性别只能是男或女&lt;br&gt;&#8217;;
</p>
<p>
  			return;
</p>
<p>
  		}
</p>
<p>
  		$this-&gt;name=$name;  //$this表示调用当前方法的对象
</p>
<p>
  		$this-&gt;sex=$sex;
</p>
<p>
  	}
</p>
<p>
  	//通过公有的方法进行取值
</p>
<p>
  	public function getInfo() {
</p>
<p>
  		echo &#8216;姓名：&#8217;.$this-&gt;name,'&lt;br&gt;&#8217;;
</p>
<p>
  		echo &#8216;性别：&#8217;.$this-&gt;sex.'&lt;hr&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //调用
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  $stu1=new Student;
</p>
<p>
  $stu1-&gt;setInfo(&#8216;tom&#8217;,&#8217;男&#8217;);
</p>
<p>
  $stu1-&gt;getInfo();
</p>
<p>
  $stu2=new Student;
</p>
<p>
  $stu2-&gt;setInfo(&#8216;berry&#8217;,&#8217;女&#8217;);
</p>
<p>
  $stu2-&gt;getInfo();
</p>
<p><img loading="lazy" decoding="async" width="510" height="189" src="/wp-content/uploads/2018/05/word-image-1577.png" class="wp-image-1800" srcset="/wp-content/uploads/2018/05/word-image-1577.png 510w, /wp-content/uploads/2018/05/word-image-1577-300x111.png 300w" sizes="(max-width: 510px) 100vw, 510px" /></p>
<h2>$this</h2>
<p>
  $this在方法的内部使用，表示调用当前方法的对象。
</p>
<h2>构造函数</h2>
<p>
  普通方法不调用就不执行
</p>
<p>
  构造函数也叫构造方法，在实例化对象的时候自动调用执行
</p>
<h3>语法一：</h3>
<p>
  Public function __construct(){
</p>
<p>
  }
</p>
<p>
  脚下留心：__construct()前面是两个下划线。
</p>
<p><img loading="lazy" decoding="async" width="597" height="171" src="/wp-content/uploads/2018/05/word-image-1578.png" class="wp-image-1801" srcset="/wp-content/uploads/2018/05/word-image-1578.png 597w, /wp-content/uploads/2018/05/word-image-1578-300x86.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></p>
<h3>语法二：和类名同名的函数是构造函数</h3>
<p>
  Public function 类名(){
</p>
<p>
  }
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="660" height="173" src="/wp-content/uploads/2018/05/word-image-1579.png" class="wp-image-1802" srcset="/wp-content/uploads/2018/05/word-image-1579.png 660w, /wp-content/uploads/2018/05/word-image-1579-300x79.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<p>
  脚下留心：推荐使用__construct(),因为__construct()的优先级最高。
</p>
<p><img loading="lazy" decoding="async" width="843" height="198" src="/wp-content/uploads/2018/05/word-image-1580.png" class="wp-image-1803" srcset="/wp-content/uploads/2018/05/word-image-1580.png 843w, /wp-content/uploads/2018/05/word-image-1580-300x70.png 300w, /wp-content/uploads/2018/05/word-image-1580-768x180.png 768w" sizes="(max-width: 843px) 100vw, 843px" /></p>
<h3>构造函数用来初始化成员变量</h3>
<p>
  成员变量就是属性
</p>
<p><img loading="lazy" decoding="async" width="845" height="415" src="/wp-content/uploads/2018/05/word-image-1581.png" class="wp-image-1804" srcset="/wp-content/uploads/2018/05/word-image-1581.png 845w, /wp-content/uploads/2018/05/word-image-1581-300x147.png 300w, /wp-content/uploads/2018/05/word-image-1581-768x377.png 768w" sizes="(max-width: 845px) 100vw, 845px" /></p>
<h2>析构函数</h2>
<p>
  当对象销毁的时候自动调用
</p>
<h3>语法</h3>
<p>
  Public function __destruct(){
</p>
<p>
  }
</p>
<h3>代码</h3>
<p><img loading="lazy" decoding="async" width="788" height="419" src="/wp-content/uploads/2018/05/word-image-1582.png" class="wp-image-1805" srcset="/wp-content/uploads/2018/05/word-image-1582.png 788w, /wp-content/uploads/2018/05/word-image-1582-300x160.png 300w, /wp-content/uploads/2018/05/word-image-1582-768x408.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></p>
<p>
  脚下留心：
</p>
<ol>
<li>
  构造函数和析构函数是PHP自己调用，不能手动调用
</li>
<li>
  构造函数可以带有参数，析构函数不能带有参数。
</li>
</ol>
<p>
  多学一招：数据的存储和销毁分为两种情况:先进先出（队列）
</p>
<p><img loading="lazy" decoding="async" width="643" height="124" src="/wp-content/uploads/2018/05/word-image-1583.png" class="wp-image-1806" srcset="/wp-content/uploads/2018/05/word-image-1583.png 643w, /wp-content/uploads/2018/05/word-image-1583-300x58.png 300w" sizes="(max-width: 643px) 100vw, 643px" /></p>
<p>
  先进后出（出入栈）
</p>
<p><img loading="lazy" decoding="async" width="311" height="189" src="/wp-content/uploads/2018/05/word-image-1584.png" class="wp-image-1807" srcset="/wp-content/uploads/2018/05/word-image-1584.png 311w, /wp-content/uploads/2018/05/word-image-1584-300x182.png 300w" sizes="(max-width: 311px) 100vw, 311px" /></p>
<h2>对象在内存中的分布</h2>
<p>
  对象的本质就是复杂变量
</p>
<p>
  类的本质就是复杂的数据类型
</p>
<p>
  分析如下代码
</p>
<p>
  &lt;?php
</p>
<p>
  class Student {
</p>
<p>
  	private $name;
</p>
<p>
  	private $sex;
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8216;i am a student&lt;br&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  $stu1=new Student();	//将堆区的地址付给栈区的$stu1
</p>
<p>
  $stu1-&gt;show();
</p>
<p>
  $stu2=new Student();
</p>
<p>
  $stu2-&gt;show();
</p>
<p>
  在内存中结构
</p>
<p><img loading="lazy" decoding="async" width="1032" height="281" src="/wp-content/uploads/2018/05/word-image-1585.png" class="wp-image-1808" srcset="/wp-content/uploads/2018/05/word-image-1585.png 1032w, /wp-content/uploads/2018/05/word-image-1585-300x82.png 300w, /wp-content/uploads/2018/05/word-image-1585-768x209.png 768w, /wp-content/uploads/2018/05/word-image-1585-1024x279.png 1024w" sizes="(max-width: 1032px) 100vw, 1032px" /></p>
<p>
  堆区特点：体积大，查询速度慢
</p>
<p>
  栈区特点：体积小，查询速度快
</p>
<p>
  基本数据类型的数据都存放在栈区中；复杂数据类型都存储在堆区中，但是堆区中的地址保存到栈区中。
</p>
<h2>继承</h2>
<ol>
<li>
  代码具有层次结构
</li>
<li>
  子类继承了父类的属性和方法，实现了代码的可重用性。
</li>
</ol>
<h3>语法</h3>
<p>
  Class 子类 extends 父类{
</p>
<p>
  }
</p>
<h3>继承的例题</h3>
<p>
  &lt;?php
</p>
<p>
  //父类
</p>
<p>
  class Person {
</p>
<p>
  	public $name=&#8217;tom&#8217;;
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8216;i am a boy!&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //子类
</p>
<p>
  class Student extends Person {
</p>
<p>
  }
</p>
<p>
  //测试
</p>
<p>
  $stu=new Student();
</p>
<p>
  echo $stu-&gt;name,'&lt;br&gt;&#8217;;
</p>
<p>
  $stu-&gt;show();
</p>
<p><img loading="lazy" decoding="async" width="375" height="66" src="/wp-content/uploads/2018/05/word-image-1586.png" class="wp-image-1809" srcset="/wp-content/uploads/2018/05/word-image-1586.png 375w, /wp-content/uploads/2018/05/word-image-1586-300x53.png 300w" sizes="(max-width: 375px) 100vw, 375px" /></p>
<p>
  分析：$stu-&gt;name执行过程，首先在Student中寻找$name,如果找到就访问，如果找不到，就到Person类中找$name。
</p>
<h3>调用父类的属性和方法</h3>
<p>
  在子类中通过$this关键字可以调用父类属性和方法
</p>
<p><img loading="lazy" decoding="async" width="964" height="398" src="/wp-content/uploads/2018/05/word-image-1587.png" class="wp-image-1810" srcset="/wp-content/uploads/2018/05/word-image-1587.png 964w, /wp-content/uploads/2018/05/word-image-1587-300x124.png 300w, /wp-content/uploads/2018/05/word-image-1587-768x317.png 768w" sizes="(max-width: 964px) 100vw, 964px" /></p>
<h3>调用父类的构造方法</h3>
<table>
<tr>
<td>
<p>
  父类的构造方法
</p>
</td>
<td>
<p>
  子类的构造方法
</p>
</td>
<td>
<p>
  实例化子类
</p>
</td>
</tr>
<tr>
<td>
<p>
  没有
</p>
</td>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  调用子类构造方法
</p>
</td>
</tr>
<tr>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  没有
</p>
</td>
<td>
<p>
  调用父类构造方法
</p>
</td>
</tr>
<tr>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  有
</p>
</td>
<td>
<p>
  调用子类构造方法
</p>
</td>
</tr>
</table>
<p>
  总结一句话：如果子类有构造方法就调用子类的，如果子类没有就调用父类的。
</p>
<p>
  通过parent::__construct()调用父类的构造函数
</p>
<p><img loading="lazy" decoding="async" width="993" height="430" src="/wp-content/uploads/2018/05/word-image-1588.png" class="wp-image-1811" srcset="/wp-content/uploads/2018/05/word-image-1588.png 993w, /wp-content/uploads/2018/05/word-image-1588-300x130.png 300w, /wp-content/uploads/2018/05/word-image-1588-768x333.png 768w" sizes="(max-width: 993px) 100vw, 993px" /></p>
<p>
  Parent表示父类的名字
</p>
<h3>给父类传递参数</h3>
<p>
  &lt;?php
</p>
<p>
  //父类
</p>
<p>
  class Person {
</p>
<p>
  	protected $name;
</p>
<p>
  	protected $sex;
</p>
<p>
  	public function __construct($name,$sex) {
</p>
<p>
  		$this-&gt;name=$name;
</p>
<p>
  		$this-&gt;sex=$sex;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //子类
</p>
<p>
  class Student extends Person {
</p>
<p>
  	private $score;
</p>
<p>
  	public function __construct($name,$sex,$score) {
</p>
<p>
  		parent::__construct($name,$sex);//调用父类的构造函数
</p>
<p>
  		$this-&gt;score=$score;
</p>
<p>
  	}
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8220;姓名：{$this-&gt;name}&lt;br&gt;&#8221;;
</p>
<p>
  		echo &#8220;性别：{$this-&gt;sex}&lt;br&gt;&#8221;;
</p>
<p>
  		echo &#8220;成绩：{$this-&gt;score}&lt;br&gt;&#8221;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  //测试
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  $stu=new Student(&#8216;tom&#8217;,&#8217;男&#8217;,88);
</p>
<p>
  $stu-&gt;show();
</p>
<p>
  运行结果
</p>
<p><img loading="lazy" decoding="async" width="204" height="76" src="/wp-content/uploads/2018/05/word-image-1589.png" class="wp-image-1812" /></p>
<h2>parent表示父类的名字</h2>
<p><img loading="lazy" decoding="async" width="653" height="280" src="/wp-content/uploads/2018/05/word-image-1590.png" class="wp-image-1813" srcset="/wp-content/uploads/2018/05/word-image-1590.png 653w, /wp-content/uploads/2018/05/word-image-1590-300x129.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<p>
  提醒：使用parent关键字可以降低程序的耦合性。
</p>
<h2> protected（受保护的）</h2>
<p>
  protected修饰的在整个继承链上访问
</p>
<p><img loading="lazy" decoding="async" width="711" height="257" src="/wp-content/uploads/2018/05/word-image-1591.png" class="wp-image-1814" srcset="/wp-content/uploads/2018/05/word-image-1591.png 711w, /wp-content/uploads/2018/05/word-image-1591-300x108.png 300w" sizes="(max-width: 711px) 100vw, 711px" /></p>
<h2>$this</h2>
<p>
  $this表示当前对象的引用（地址）
</p>
<p><img loading="lazy" decoding="async" width="488" height="228" src="/wp-content/uploads/2018/05/word-image-1592.png" class="wp-image-1815" srcset="/wp-content/uploads/2018/05/word-image-1592.png 488w, /wp-content/uploads/2018/05/word-image-1592-300x140.png 300w" sizes="(max-width: 488px) 100vw, 488px" /></p>
<h2>封装</h2>
<p>
  通过访问修饰符来封装，有选择性的提供数据。
</p>
<p><img loading="lazy" decoding="async" width="956" height="565" src="/wp-content/uploads/2018/05/word-image-1593.png" class="wp-image-1816" srcset="/wp-content/uploads/2018/05/word-image-1593.png 956w, /wp-content/uploads/2018/05/word-image-1593-300x177.png 300w, /wp-content/uploads/2018/05/word-image-1593-768x454.png 768w" sizes="(max-width: 956px) 100vw, 956px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/php/1789.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>面向对象编程（四）netbeans、 反射 Reflection、 命名空间、 异常处理、 类、 类别名</title>
		<link>/php/1707.html</link>
					<comments>/php/1707.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Fri, 18 May 2018 12:54:40 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[面向对象]]></category>
		<category><![CDATA[面向对象编程]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[反射 Reflection]]></category>
		<category><![CDATA[命名空间]]></category>
		<category><![CDATA[异常处理]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[类别名]]></category>
		<guid isPermaLink="false">/?p=1707</guid>

					<description><![CDATA[面向对象编程（四） 命名空间 命名空间介绍 如果一个项目很大，项目中由很多文件组成，如何有序的组织这些文件就是 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>面向对象编程（四）</h1>
<h2>命名空间</h2>
<h3>命名空间介绍</h3>
<p>
  如果一个项目很大，项目中由很多文件组成，如何有序的组织这些文件就是一个大问题，PHP提供了命名空间来解决。
</p>
<p>
  多学一招：
</p>
<p>
  C#语言中也是通过“命名空间”来解决的
</p>
<p>
  Java语言通过“包”来解决的。
</p>
<h3>命名空间的声明与使用</h3>
<p>
  通过namespace来声明命名空间
</p>
<p><img loading="lazy" decoding="async" width="767" height="278" src="/wp-content/uploads/2018/05/word-image-1493.png" class="wp-image-1709" srcset="/wp-content/uploads/2018/05/word-image-1493.png 767w, /wp-content/uploads/2018/05/word-image-1493-300x109.png 300w" sizes="(max-width: 767px) 100vw, 767px" /></p>
<h3>多级命名空间</h3>
<p>
  &lt;?php
</p>
<p>
  namespace China\ShangHai\PuDong;		//多级命名空间
</p>
<p>
  function getInfo() {
</p>
<p>
  	echo &#8216;我是中国人&lt;br&gt;&#8217;;
</p>
<p>
  }
</p>
<p>
  namespace USA\Washington;
</p>
<p>
  function getInfo() {
</p>
<p>
  	echo &#8216;I am a America&lt;br&gt;&#8217;;
</p>
<p>
  }
</p>
<p>
  //调用
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  getInfo();		//I am a America
</p>
<p>
  \China\ShangHai\PuDong\getInfo();	//我是中国人
</p>
<h3>访问空间元素的三种方法</h3>
<ol>
<li>
  非限定名称访问（类似于相对路径）
</li>
<li>
  完全限定名称访问（绝对路径）
</li>
<li>
  【部分】限定名称访问（相对路径）
</li>
</ol>
<p><img loading="lazy" decoding="async" width="991" height="341" src="/wp-content/uploads/2018/05/word-image-1494.png" class="wp-image-1710" srcset="/wp-content/uploads/2018/05/word-image-1494.png 991w, /wp-content/uploads/2018/05/word-image-1494-300x103.png 300w, /wp-content/uploads/2018/05/word-image-1494-768x264.png 768w" sizes="(max-width: 991px) 100vw, 991px" /></p>
<h3>引入命名空间（use）</h3>
<p><img loading="lazy" decoding="async" width="893" height="278" src="/wp-content/uploads/2018/05/word-image-1495.png" class="wp-image-1711" srcset="/wp-content/uploads/2018/05/word-image-1495.png 893w, /wp-content/uploads/2018/05/word-image-1495-300x93.png 300w, /wp-content/uploads/2018/05/word-image-1495-768x239.png 768w" sizes="(max-width: 893px) 100vw, 893px" /></p>
<p>
  分析：PuDong\getInfo()如何调用的？
</p>
<p>
  第一步：通过命名空间拼接，拼接成\ USA\Washington\ PuDong\getInfo()，但是在这个地址下找不到此函数，所以继续执行第二步
</p>
<p>
  第二步：由于引入了China\ShangHai\PuDong命名空间，又可以拼接成China\ShangHai\PuDong\ getInfo()，这个地址是可以找到函数的，所以调用此函数。
</p>
<h3>引入类（use）</h3>
<p>
  通过use关键字引入类
</p>
<p><img loading="lazy" decoding="async" width="892" height="427" src="/wp-content/uploads/2018/05/word-image-1496.png" class="wp-image-1712" srcset="/wp-content/uploads/2018/05/word-image-1496.png 892w, /wp-content/uploads/2018/05/word-image-1496-300x144.png 300w, /wp-content/uploads/2018/05/word-image-1496-768x368.png 768w" sizes="(max-width: 892px) 100vw, 892px" /></p>
<h3>给类取别名（as）</h3>
<p>
  如果引入的类和已经存在的类同名，就会报错，我们可以引入类的同时给类取别名
</p>
<p>
  &lt;?php
</p>
<p>
  namespace China\ShangHai\PuDong;
</p>
<p>
  class Person {
</p>
<p>
  	public $name=&#8217;中国人&#8217;;
</p>
<p>
  }
</p>
<p>
  namespace USA\Washington;
</p>
<p>
  class Person{
</p>
<p>
  	public $name=&#8217;美国人&#8217;;
</p>
<p>
  }
</p>
<p>
  header(&#8216;Content-Type:text/html;charset=utf-8&#8217;);
</p>
<p>
  use China\ShangHai\PuDong\Person as P;		//引入类,并给类取别名
</p>
<p>
  $person=new P();
</p>
<p>
  echo $person-&gt;name;		//中国人
</p>
<h3>公共命名空间</h3>
<p>
  如果PHP文件中没有namespace关键字声明，该文件的元素都在“公共命名空间”下，访问公共命名空间用“\”。
</p>
<p><img loading="lazy" decoding="async" width="506" height="123" src="/wp-content/uploads/2018/05/word-image-1497.png" class="wp-image-1713" srcset="/wp-content/uploads/2018/05/word-image-1497.png 506w, /wp-content/uploads/2018/05/word-image-1497-300x73.png 300w" sizes="(max-width: 506px) 100vw, 506px" /></p>
<h3>命名空间的注意事项</h3>
<ol>
<li>
  命名空间中可以放函数，类，const常量
</li>
</ol>
<p><img loading="lazy" decoding="async" width="658" height="128" src="/wp-content/uploads/2018/05/word-image-1498.png" class="wp-image-1714" srcset="/wp-content/uploads/2018/05/word-image-1498.png 658w, /wp-content/uploads/2018/05/word-image-1498-300x58.png 300w" sizes="(max-width: 658px) 100vw, 658px" /><br />
<img loading="lazy" decoding="async" width="922" height="90" src="/wp-content/uploads/2018/05/word-image-1499.png" class="wp-image-1715" srcset="/wp-content/uploads/2018/05/word-image-1499.png 922w, /wp-content/uploads/2018/05/word-image-1499-300x29.png 300w, /wp-content/uploads/2018/05/word-image-1499-768x75.png 768w" sizes="(max-width: 922px) 100vw, 922px" /></p>
<ol>
<li>
  在第一个namespace之前不能有任何的代码，header()也不行。
</li>
</ol>
<p><img loading="lazy" decoding="async" width="1106" height="108" src="/wp-content/uploads/2018/05/word-image-1500.png" class="wp-image-1716" srcset="/wp-content/uploads/2018/05/word-image-1500.png 1106w, /wp-content/uploads/2018/05/word-image-1500-300x29.png 300w, /wp-content/uploads/2018/05/word-image-1500-768x75.png 768w, /wp-content/uploads/2018/05/word-image-1500-1024x100.png 1024w" sizes="(max-width: 1106px) 100vw, 1106px" /></p>
<ol>
<li>
  包含文件不能改变当前的命名空间
</li>
</ol>
<p><img loading="lazy" decoding="async" width="675" height="87" src="/wp-content/uploads/2018/05/word-image-1501.png" class="wp-image-1717" srcset="/wp-content/uploads/2018/05/word-image-1501.png 675w, /wp-content/uploads/2018/05/word-image-1501-300x39.png 300w" sizes="(max-width: 675px) 100vw, 675px" /></p>
<h3>用文件的地址做命名空间，通过命名空间就可以实现自动加载类</h3>
<ol>
<li>
  在Framework/Core文件夹下创建Student.class.php
</li>
</ol>
<p>
  &lt;?php
</p>
<p>
  namespace Framework\Core;
</p>
<p>
  class Student {
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8216;Core\Student\show()&lt;br&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<ol>
<li>
  在Framework/Lib文件夹下创建Student.class.php
</li>
</ol>
<p>
  &lt;?php
</p>
<p>
  namespace Framework\Lib;
</p>
<p>
  class Student {
</p>
<p>
  	public function show() {
</p>
<p>
  		echo &#8216;Lib\Student\show()&lt;br&gt;&#8217;;
</p>
<p>
  	}
</p>
<p>
  }
</p>
<ol>
<li>
  在php中通过命名空间实现自动加载类
</li>
</ol>
<p><img loading="lazy" decoding="async" width="852" height="217" src="/wp-content/uploads/2018/05/word-image-1502.png" class="wp-image-1718" srcset="/wp-content/uploads/2018/05/word-image-1502.png 852w, /wp-content/uploads/2018/05/word-image-1502-300x76.png 300w, /wp-content/uploads/2018/05/word-image-1502-768x196.png 768w" sizes="(max-width: 852px) 100vw, 852px" /></p>
<h2>异常处理（Exception）</h2>
<h3>使用的关键字</h3>
<p>
  try：检测代码中的异常
</p>
<p>
  catch：捕获抛出的异常
</p>
<p>
  throw：抛出异常
</p>
<p>
  Exception：PHP内置的异常类
</p>
<h3>Exception异常类中的方法</h3>
<p>
  Exception是基础异常类，该类提供了一些方法
</p>
<table>
<tr>
<td>
<p>
  方法
</p>
</td>
<td>
<p>
  描述
</p>
</td>
</tr>
<tr>
<td>
<p>
  getMessage()
</p>
</td>
<td>
<p>
  获取异常中的错误信息
</p>
</td>
</tr>
<tr>
<td>
<p>
  getCode()
</p>
</td>
<td>
<p>
  获取异常的编码
</p>
</td>
</tr>
<tr>
<td>
<p>
  getFile()
</p>
</td>
<td>
<p>
  产生异常的文件路径
</p>
</td>
</tr>
<tr>
<td>
<p>
  getLine()
</p>
</td>
<td>
<p>
  产生异常的行号
</p>
</td>
</tr>
</table>
<h3>异常的例题</h3>
<p><img loading="lazy" decoding="async" width="754" height="421" src="/wp-content/uploads/2018/05/word-image-1503.png" class="wp-image-1719" srcset="/wp-content/uploads/2018/05/word-image-1503.png 754w, /wp-content/uploads/2018/05/word-image-1503-300x168.png 300w" sizes="(max-width: 754px) 100vw, 754px" /></p>
<h3>自定义异常，捕获多个异常</h3>
<p>
  PHP只提供了异常类，没有提供具体的某种异常，比如年龄异常，邮件异常等。
</p>
<p>
  自定义异常必须继承Exception类，Exception类是所有异常类的父类。
</p>
<p>
  &lt;?php
</p>
<p>
  //空异常
</p>
<p>
  class NullException extends Exception {
</p>
<p>
  }
</p>
<p>
  //年龄异常
</p>
<p>
  class AgeException extends Exception {
</p>
<p>
  }
</p>
<p>
  if(isset($_POST[&#8216;button&#8217;])) {
</p>
<p>
  	$name=$_POST[&#8216;name&#8217;];
</p>
<p>
  	$age=$_POST[&#8216;age&#8217;];
</p>
<p>
  	try
</p>
<p>
  	{
</p>
<p>
  		if($name==&#8221;)
</p>
<p>
  			throw new NullException(&#8216;姓名不能为空&#8217;);	//抛出空异常
</p>
<p>
  		if($age==&#8221;)
</p>
<p>
  			throw new NullException(&#8216;年龄不能为空&#8217;);	//抛出空异常
</p>
<p>
  		if(!($age&gt;=10 &amp;&amp; $age&lt;=20))
</p>
<p>
  			throw new AgeException(&#8216;年龄必须在10-20之间&#8217;);	//抛出年龄异常
</p>
<p>
  	}
</p>
<p>
  	catch(NullException $e)
</p>
<p>
  	{
</p>
<p>
  		echo $e-&gt;getMessage();
</p>
<p>
  	}
</p>
<p>
  	catch(AgeException $e)
</p>
<p>
  	{
</p>
<p>
  		echo $e-&gt;getMessage();
</p>
<p>
  	}
</p>
<p>
  	catch(Exception $e){		//必须放在所有的catch的最后
</p>
<p>
  		echo $e-&gt;getMessage();
</p>
<p>
  	}
</p>
<p>
  }
</p>
<p>
  ?&gt;
</p>
<p>
  &lt;form method=&#8221;post&#8221; action=&#8221;&#8221;&gt;
</p>
<p>
  	姓名： &lt;input type=&#8221;text&#8221; name=&#8221;name&#8221;&gt; &lt;br /&gt;
</p>
<p>
  	年龄： &lt;input type=&#8221;text&#8221; name=&#8221;age&#8221;&gt; &lt;br /&gt;
</p>
<p>
  	&lt;input type=&#8221;submit&#8221; name=&#8221;button&#8221; value=&#8221;提交&#8221;&gt;
</p>
<p>
  &lt;/form&gt;
</p>
<h2>介绍netbeans</h2>
<h3>安装netbeans</h3>
<p>
  在安装netbeans之前必须先安装jdk（java开发包）
</p>
<p><img loading="lazy" decoding="async" width="567" height="41" src="/wp-content/uploads/2018/05/word-image-1504.png" class="wp-image-1720" srcset="/wp-content/uploads/2018/05/word-image-1504.png 567w, /wp-content/uploads/2018/05/word-image-1504-300x22.png 300w" sizes="(max-width: 567px) 100vw, 567px" /></p>
<p>
  安装JDK后，再下一步，下一步安装netbeans.。
</p>
<p><img loading="lazy" decoding="async" width="212" height="22" src="/wp-content/uploads/2018/05/word-image-1505.png" class="wp-image-1721" /></p>
<h3>使用netbeans</h3>
<p>
  双击netbeans图标
</p>
<p><img loading="lazy" decoding="async" width="67" height="91" src="/wp-content/uploads/2018/05/word-image-1506.png" class="wp-image-1722" /></p>
<p>
  继续如下操作
</p>
<p><img loading="lazy" decoding="async" width="779" height="173" src="/wp-content/uploads/2018/05/word-image-1507.png" class="wp-image-1723" srcset="/wp-content/uploads/2018/05/word-image-1507.png 779w, /wp-content/uploads/2018/05/word-image-1507-300x67.png 300w, /wp-content/uploads/2018/05/word-image-1507-768x171.png 768w" sizes="(max-width: 779px) 100vw, 779px" /><br />
<img loading="lazy" decoding="async" width="716" height="501" src="/wp-content/uploads/2018/05/word-image-1508.png" class="wp-image-1724" srcset="/wp-content/uploads/2018/05/word-image-1508.png 716w, /wp-content/uploads/2018/05/word-image-1508-300x210.png 300w" sizes="(max-width: 716px) 100vw, 716px" /><br />
<img loading="lazy" decoding="async" width="732" height="505" src="/wp-content/uploads/2018/05/word-image-1509.png" class="wp-image-1725" srcset="/wp-content/uploads/2018/05/word-image-1509.png 732w, /wp-content/uploads/2018/05/word-image-1509-300x207.png 300w" sizes="(max-width: 732px) 100vw, 732px" /></p>
<p>
  创建完毕后，在虚拟目录的文件夹中多了一个“nbproject”文件夹，此文件夹用来让netbeans软件管理虚拟目录的，不是项目文件夹。在最后项目上传到服务器的时候要将此文件夹删除。
</p>
<h2>反射（Reflection）</h2>
<h3>反射的概念</h3>
<p>
  程序可以访问、检测和修改它本身状态或行为的一种能力
</p>
<h3>反射的作用</h3>
<p>
  获取对象对应的类中的属性，方法，参数，注释等封闭的信息，主要用来了解类、方法等内部结构。
</p>
<h3>反射的分类</h3>
<p>
  了解如下几个反射类即可。
</p>
<p><img loading="lazy" decoding="async" width="720" height="278" src="/wp-content/uploads/2018/05/word-image-1510.png" class="wp-image-1726" srcset="/wp-content/uploads/2018/05/word-image-1510.png 720w, /wp-content/uploads/2018/05/word-image-1510-300x116.png 300w" sizes="(max-width: 720px) 100vw, 720px" /></p>
<h2>使用反射类（了解内容）</h2>
<h3>通过反射了解类的内部结构</h3>
<p>
  语法：
</p>
<p>
  ReflectionClass::export(类名);
</p>
<p>
  例题
</p>
<p><img loading="lazy" decoding="async" width="772" height="289" src="/wp-content/uploads/2018/05/word-image-1511.png" class="wp-image-1727" srcset="/wp-content/uploads/2018/05/word-image-1511.png 772w, /wp-content/uploads/2018/05/word-image-1511-300x112.png 300w, /wp-content/uploads/2018/05/word-image-1511-768x288.png 768w" sizes="(max-width: 772px) 100vw, 772px" /></p>
<p>
  通过上面的例题可以得出结论，PHP最顶层的父类是一个空类，代码
</p>
<p>
  class stdClass{
</p>
<p>
  }
</p>
<h3>通过反射获取类中的属性、方法、常量</h3>
<p>
  &lt;?php
</p>
<p>
  class Student{
</p>
<p>
      const PI=3.14;
</p>
<p>
      public $name=&#8217;tom&#8217;;
</p>
<p>
      private $sex=&#8217;f&#8217;;
</p>
<p>
      public function show(){
</p>
<p>
      }
</p>
<p>
  }
</p>
<p>
  //通过反射获取类中的成员
</p>
<p>
  $info= new ReflectionClass(&#8216;Student&#8217;);  //实例化反射类对象，此对象中包含了Student类中的信息
</p>
<p>
  //获取常量信息
</p>
<p>
  $const=$info-&gt;getConstants();       //获取所有常量,返回常量数组
</p>
<p>
  $const=$info-&gt;getConstant(&#8216;PI&#8217;);    //获取PI常量
</p>
<p>
  //获取方法信息
</p>
<p>
  $method=$info-&gt;getMethods();        //获取所有方法,返回方法信息数组
</p>
<p>
  $method=$info-&gt;getMethod(&#8216;show&#8217;);   //获取show()方法信息
</p>
<p>
  //获取属性信息
</p>
<p>
  $propty=$info-&gt;getProperties();     //获取所有属性信息
</p>
<p>
  $propty=$info-&gt;getProperty(&#8216;sex&#8217;);  //获取sex属性
</p>
<p>
  var_dump($propty);
</p>
<h3>通过反射实例化对象</h3>
<p><img loading="lazy" decoding="async" width="803" height="303" src="/wp-content/uploads/2018/05/word-image-1512.png" class="wp-image-1728" srcset="/wp-content/uploads/2018/05/word-image-1512.png 803w, /wp-content/uploads/2018/05/word-image-1512-300x113.png 300w, /wp-content/uploads/2018/05/word-image-1512-768x290.png 768w" sizes="(max-width: 803px) 100vw, 803px" /></p>
<p>
  newInstance()就是用来实例化对象，构造函数需要几个参数，就通过newInstance()传递几个参数。
</p>
<h3>通过反向代理调用类方法</h3>
<p>
  正向代理：局域网中所有电脑通过服务器访问外网，局域网中电脑感受到服务器的存在，这种代理是正向代理
</p>
<p><img loading="lazy" decoding="async" width="611" height="130" src="/wp-content/uploads/2018/05/word-image-1513.png" class="wp-image-1729" srcset="/wp-content/uploads/2018/05/word-image-1513.png 611w, /wp-content/uploads/2018/05/word-image-1513-300x64.png 300w" sizes="(max-width: 611px) 100vw, 611px" /></p>
<p>
  反向代理
</p>
<p><img loading="lazy" decoding="async" width="653" height="206" src="/wp-content/uploads/2018/05/word-image-1514.png" class="wp-image-1730" srcset="/wp-content/uploads/2018/05/word-image-1514.png 653w, /wp-content/uploads/2018/05/word-image-1514-300x95.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<p>
  将上面的理论平移到反射中来
</p>
<p>
  A调用A的方法：正向代理
</p>
<p><img loading="lazy" decoding="async" width="547" height="175" src="/wp-content/uploads/2018/05/word-image-1515.png" class="wp-image-1731" srcset="/wp-content/uploads/2018/05/word-image-1515.png 547w, /wp-content/uploads/2018/05/word-image-1515-300x96.png 300w" sizes="(max-width: 547px) 100vw, 547px" /></p>
<p>
  通过反射，A调用B的方法：反向代理
</p>
<p><img loading="lazy" decoding="async" width="835" height="258" src="/wp-content/uploads/2018/05/word-image-1516.png" class="wp-image-1732" srcset="/wp-content/uploads/2018/05/word-image-1516.png 835w, /wp-content/uploads/2018/05/word-image-1516-300x93.png 300w, /wp-content/uploads/2018/05/word-image-1516-768x237.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></p>
]]></content:encoded>
					
					<wfw:commentRss>/php/1707.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
