AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
# extends继承 extends继承 > class 子类名 extends 父类名{...} 1.子类继承了父类,继承所有的属性和方法,但是私有属性和方法不可以调用 2.子类可以重写父类中的属性和方法,直接重新定义属性和方法 3.调用规则: 类外部类内部子类public可以可以可以protected**不可以**可以**可以**private**不可以**可以**不可以**4.如果父类定义方法时使用了 final,则该方法不可被覆盖(有固定不变的方法用final修饰)。可以**通过 parent:: 来访问被覆盖的方法或属性**。同样如果一个类被声明为 final,则不能被继承 父类定义了析构函数,如果子类也定义了析构函数那么父类的析构函数将不被继承,但是可以通过 **:parent::父类函数 或 父类名::父类函数调用此析构函数** **5.只能继承一个父类,不能同时继承多个父类** ``` <pre class="calibre10">``` <span class="token">// 定义父类 </span> class <span class="token4">Kang</span> <span class="token3">{</span> public $name <span class="token1">=</span> <span class="token2">'玄烨'</span><span class="token3">;</span> protected $country <span class="token1">=</span> <span class="token2">'清朝'</span><span class="token3">;</span> private $wife <span class="token1">=</span> <span class="token2">'赫舍里'</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">info</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"{$this->name}是{$this->country}的皇帝,她的老婆的是{$this->wife}"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 定义子类 </span> class <span class="token4">Yong</span> extends <span class="token4">Kang</span> <span class="token3">{</span> <span class="token3">}</span> <span class="token">// 实例化Yong </span> $y <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Yong</span><span class="token3">;</span> <span class="token">// 调用属性 </span> echo $y<span class="token1">-</span><span class="token1">></span>name<span class="token3">;</span><span class="token">//输出:玄烨是清朝的皇帝,她的老婆的是赫舍里 </span> <span class="token">// echo $y->country;//Fatal error: Cannot access protected property致命错误:无法访问受保护的属性 </span> <span class="token">// echo $y->wife;//Notice: Undefined property:报未定义的属性</span> <span class="token">// 方法 </span> $y<span class="token1">-</span><span class="token1">></span><span class="token4">info</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo $y<span class="token1">-</span><span class="token1">></span><span class="token4">info</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">''</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$y<span class="token3">)</span><span class="token3">;</span> <span class="token">/* object(Yong)#1 (3) { ["name"]=> string(6) "玄烨" ["country":protected]=> string(6) "清朝" ["wife":"Kang":private]=> string(9) "赫舍里" } 从打印的$y和echo $y->info();可以看出子类继承了父类,把所有的属性和方法全部继承下来但是属性和方法的值没有改变;如果我们要想子类的值那么就涉及到子类的覆盖 */</span> ``` ``` **例子2 子类的覆盖:** ``` <pre class="calibre10">``` class <span class="token4">Kang</span> <span class="token3">{</span> public $name <span class="token1">=</span> <span class="token2">'玄烨'</span><span class="token3">;</span> protected $country <span class="token1">=</span> <span class="token2">'清朝'</span><span class="token3">;</span> private $wife <span class="token1">=</span> <span class="token2">'赫舍里'</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">info</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"{$this->name}是{$this->country}的皇帝,他的老婆是{$this->wife}"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">Yong</span> extends <span class="token4">Kang</span> <span class="token3">{</span> <span class="token">// 子类继承了父类,要更改对应的属性(直接重写) </span> public $name <span class="token1">=</span> <span class="token2">'四爷'</span><span class="token3">;</span> protected $country <span class="token1">=</span> <span class="token2">'大清帝国'</span><span class="token3">;</span> private $wife <span class="token1">=</span> <span class="token2">'甄嬛'</span><span class="token3">;</span> <span class="token">// 通过定义相同名字的方法来重写父类方法 </span> public <span class="token5">function</span> <span class="token4">info</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"{$this->name}的老婆是{$this->wife}"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 实例化Yong类 </span> $y <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Yong</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span>$y<span class="token3">)</span><span class="token3">;</span> $y<span class="token1">-</span><span class="token1">></span><span class="token4">info</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> ``` ``` 例子3: ``` <pre class="calibre10">``` class <span class="token4">Kang</span> <span class="token3">{</span> public $name <span class="token1">=</span> <span class="token2">'玄烨'</span><span class="token3">;</span> protected $country <span class="token1">=</span> <span class="token2">'清朝'</span><span class="token3">;</span> private $wife <span class="token1">=</span> <span class="token2">'赫舍里'</span><span class="token3">;</span> <span class="token3">}</span> class <span class="token4">Yong</span> extends <span class="token4">Kang</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">getInfo</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"{$this->name}是{$this->country}的皇帝"</span><span class="token3">;</span> <span class="token3">}</span> public <span class="token5">function</span> <span class="token4">getWife</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"{$this->name}的老婆是{$this->wife}"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 实例化Yong类 </span> $y <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Yong</span><span class="token3">;</span> <span class="token">// 调用getInfo() </span> <span class="token">// $y->getInfo(); // 玄烨是清朝的皇帝</span> <span class="token">/* 子类继承了父类,可以获取父类中的公有属性和受保护的属性 子类可以继承下来私有的属性,但是可看不可摸(调用) var_dump($y);//object(Yong)#1 (3) { ["name"]=> string(6) "玄烨" ["country":protected]=> string(6) "清朝" ["wife":"Kang":private]=> string(9) "赫舍里" } $y->getWife(); // 玄烨的老婆是(报Notice错误) */</span> ``` ``` 例子4:可以在父类的内部调用父类自己的私有方法 ``` <pre class="calibre17">``` class <span class="token4">Kang</span> <span class="token3">{</span> public $name <span class="token1">=</span> <span class="token2">'玄烨'</span><span class="token3">;</span> private $wife <span class="token1">=</span> <span class="token2">'赫舍里'</span><span class="token3">;</span> public <span class="token5">function</span> <span class="token4">getInfo</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> echo <span class="token2">"{$this->name}的老婆是{$this->wife}"</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> class <span class="token4">Yong</span> extends <span class="token4">Kang</span><span class="token3">{</span> <span class="token3">}</span> <span class="token">// 实例化Yong类 </span> $y <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Yong</span><span class="token3">;</span> <span class="token">// getInfo()是$y(Yong)的方法,在这个方法内部,调用了父类的私有属性,可以正常输出 </span> $y<span class="token1">-</span><span class="token1">></span><span class="token4">getInfo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> ``` ```