php 面向对象 继承
class parentclass { private $private = 1; public function getprivate() { echo 'getprivate() belong to class ' . get_class($this) . '
'; return $this->private; }}class son extends parentclass {}$son = new son();echo 'private=' . $son->getprivate();
我预期结果是应该报错的,但并没有报错。
执行结果是:
in class parentclass function getprivate():son
private=1
想问为什么$private私有属性会被打印出来呢
回复讨论(解决方案) 这样都打印不出来,然后你想这个$private怎么样才能暴露出来?
php的private是指属性或方法,你不能通过外部直接访问,意思是
你不能$son->private这么去访问,而只能通过内部的public方法暴露出来。
getprivate 是 parentclass 类的方法,当然能通过 parentclass::getprivate 打印出 parentclass 的私有属性 private
正如#1,#2楼所说,因为子类继承了基类的方法,基类的方法可以打印出私有属性。
而子类不能继承基类的私有属性
因此楼主想看到的结果其实是
echo $son->$private;吧
这样都打印不出来,然后你想这个$private怎么样才能暴露出来?
php的private是指属性或方法,你不能通过外部直接访问,意思是
你不能$son->private这么去访问,而只能通过内部的public方法暴露出来。
private需要以非直接的方式去得到它的值,这个我了解。
我不明白的是:为什么getprivate()方法中调用函数get_class()得到的是son而不是parentclass
getprivate 是 parentclass 类的方法,当然能通过 parentclass::getprivate 打印出 parentclass 的私有属性 private
既然getprivate()方法是属于parentclass类的,那为什么在getprivate()方法内,打印get_class(),却是son而不是parentclass呢
想想矛盾的地方在于父类中的方法getprivate()内,$this究竟代表了哪个类的实例呢,父类还是子类?
【看了下文档关于get_class()方法的说明中,有这样的例子
得到结果:
string(3) foostring(3) bar
这么看来$this在基类中指代的是子类的实例,那在我的例子中执行$this->private应该报未定义错误啊。】