php类的覆盖
看一个有趣的例子
<?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