php类中private属性继承问题
2014-04-23 11:25
375 查看
首先 这个题目就有点问题 因为private属性是不能被继承的
请仔细看这句话 如果父类有私有的属性。那么父类的方法只为父类的私有属性服务。
下面通过一系列列子来加深理解.
这个例子看起来很奇怪,在子类中重新定义了一个属性$sal,系统却返回了父类的属性。
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <? class employee{ private$sal=3000; //protected $sal=3000; publicfunctiongetSal(){ return$this->sal; } } class Managerextendsemployee{ protected$sal=5000; publicfunctiongetParentSal(){ //这里返回的是父类的private属性. returnparent::getSal(); } } $manager =newManager(); echo"PHP ".phpversion()."<br>"; echo $manager->getSal(); echo"<br>"; echo "parent's \$sal ".$manager->getParentSal(); ?> |
1 2 3 | PHP5.3.8 3000 parent's$sal3000 |
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <? class employee{ //private $sal=3000; protected$sal=3000; publicfunctiongetSal(){ return$this->sal; } } class Managerextendsemployee{ protected$sal=5000; publicfunctiongetParentSal(){ //这里返回的是父类的private属性. returnparent::getSal(); } } $manager =newManager(); echo"PHP ".phpversion()."<br>"; echo $manager->getSal(); echo"<br>"; echo "parent's \$sal ".$manager->getParentSal(); ?> |
1 2 3 | PHP5.3.8 5000 parent's$sal5000 |
第二个列子中 父类的protected $sal被重写 $manager->getSal()这个父类的方法 调用已经被重写的$sal 父类的$sal在内存中是不存在的 此时内存中只有一个$sal
接下来看第三个列子
子类中重写的方法对当前private有效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <? class employee{ private$sal=3000; publicfunctiongetSal(){ return$this->sal; } } classManagerextendsemployee{ private$sal=5000; //重写过的方法 publicfunctiongetSal(){ return$this->sal; } publicfunctiongetParentSal(){ //这里返回的是父类的private属性. returnparent::getSal(); } } $manager =newManager(); echo"PHP ".phpversion()."<br>"; echo $manager->getSal(); echo"<br>"; echo "parent's \$sal ".$manager->getParentSal(); ?> |
1 2 3 | PHP5.3.8 5000 parent's$sal3000 |
这个列子中子类重写getSal()方法 所以他调用的是子类的属性
如果你注释子类的这一行//private $sal=5000;
你会发现一个错误:Notice: Undefined property: Manager::$sal in E:\wamp\www\oo\2-5\2-5-3.php on line 14
如果注释掉12行的子类重写方法 那么echo $manager->getSal();得到的结果是 父类的私有属性$sal 3000
打开zend调试状态看看,内存中的情况。注意最下面,有两个$sal 。分别是 3000 和 5000 。
<?
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}
class Manager extends employee {
protected $sal=5000;
public function getParentSal(){
return $this->sal;
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <? class employee{ private$sal=3000; publicfunctiongetSal(){ return$this->sal; } } class Managerextendsemployee{ protected$sal=5000; publicfunctiongetParentSal(){ return$this->sal; } } $manager =newManager(); echo"PHP ".phpversion()."<br>"; echo $manager->getSal(); ?> |
PHP
1 2 | PHP5.3.8 3000 |
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <? class employee{ protected$sal=3000; publicfunctiongetSal(){ return$this->sal; } } class Managerextendsemployee{ protected$sal=5000; publicfunctiongetParentSal(){ return$this->sal; } } $manager =newManager(); echo"PHP ".phpversion()."<br>"; echo $manager->getSal(); ?> |
PHP
PHP 5.3.8
5000
1 2 | PHP5.3.8 5000 |
在Java中当子类被创建时,父类的属性和方法在内存中都被创建,甚至构造函数也要被调用。
PHP5不是这样,PHP5调用父类用的是parent:: 而不是 parent-> ,这足以说明PHP5不想在内存中让父类也被创建。PHP5想让继承变的比Java更简单。
适应下就好。
原文地址:http://www.haidx.com/php-private.html
相关文章推荐
- php类中private属性继承问题分析
- php类中private属性继承问题分析
- 子类继承父类private属性问题
- PHP中Private私有属性继承使用的问题
- 子类继承父类private属性问题
- CSS3中的opacity透明度属性的继承问题如何解决
- c++中public、protected、private访问属性及继承
- 解决PHP继承无法访问父类静态属性的问题,延迟静态绑定
- C++中的 public和private以及protected派生类继承问题和访问权限问题
- java constructor 在构造子类时,一定会调用到父类的构造方法 “ 私有属性被继承了?”问题
- 17.iOS中继承了拥有delegate属性控件的问题
- 关于Scala子类继承父类属性的问题释疑---子类构造器参数不要与父类属性同名
- java中静态属性和和静态方法的继承问题 以及多态的实质
- C++中 public和private派生类继承问题和访问权限问题
- public protected private 成员函数和成员变量在public protected private 继承后访问权限问题
- C++中 public和private派生类继承问题和访问权限问题
- [转]关于java继承的private关键字问题
- java中静态属性和和静态方法的继承问题以及多态的实质
- 关于继承的讨论,以及私有属性继承的问题
- 继承中的private问题