> 백엔드 개발 > PHP 튜토리얼 > 写了段代码,不知道该如何理解面向对象的继承

写了段代码,不知道该如何理解面向对象的继承

WBOY
풀어 주다: 2016-06-23 14:24:33
원래의
975명이 탐색했습니다.

本帖最后由 chaoxi1991 于 2013-10-18 16:36:27 编辑

PHP 面向对象 继承

class ParentClass {    private $private = 1;    public function getPrivate()    {        echo 'getPrivate() belong to class "' . get_class($this) . '"<br>';        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()方法的说明中,有这样的例子

<?phpabstract class bar {    public function __construct()    {        var_dump(get_class($this));        var_dump(get_class());    }}class foo extends bar {}new foo;?>
로그인 후 복사
得到结果:
string(3) "foo"string(3) "bar"
로그인 후 복사
这么看来"$this"在基类中指代的是子类的实例,那在我的例子中执行"$this->private"应该报未定义错误啊。】
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿