看一个有趣的例子
<?php
class employee{
private $sal=3000; // ->1
// protected $sal=3000; // ->2
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
// return $this->getSal(); // ->3
return parent::getSal(); // ->4
}
public function getSal() {
return $this->sal;
}
}
header('content-type:text/html;charset:utf8');
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
1. public和protect
首先知道两者的区别:protect可以被继承,而private不可以被继承
->4 中parent:: 调用的是父类的方法
当父类的同名属性为private(->1启用而->2注释)时,->4获取到的是父类$sal的值;
当父类的同名属性为protect(->1注释而->2启用)时,->4获取到的是子类$sal的值;
也就是说明,父子同名的protect属性,子类会覆盖父类.而父类的private不会被继承,也就不会被覆盖
2. parent
首先当父类父类的同名属性为private(->1启用而->2注释),即父类的属性没有被覆盖时,可以看到
注意->3和->4
return $this->getSal()引用的是子类的方法
return parent::getSal()引用的是父类的方法
举个例子
<?php
class a{
public function test() {
return 'a';
}
}
class b extends a{
public function test() {
return 'b';
}
}
class c extends b{
public function test() {
return parent::test();
}
}
$t = new c();
echo $t->test(); // b
如上的继承关系中,类c中的test()会覆盖b中的test();而类b中的test()会覆盖类c中的test();
所以,类c的parent::test()会引用类b中的test()方法.
另外,如果类b中没有同名方法test(),则最后打印的结果会是a