我是面向对象编程的初学者。我对一个被声明为PRIVATE的变量感到困惑。
<?php
class dog {
private $Name;
}
class poodle extends dog {
public function test($test){
$this->Name = $test;
}
}
$poppy = new poodle;
$poppy->test("test");
echo $poppy->Name;
?>
正如我所读到的,“私有变量只能由拥有它们的确切类访问 - 子类无法访问私有父函数变量”
我的问题是,如果$ Name是私有属性,为什么脚本的输出返回“test”?它不应该输出错误消息,因为另一个类正在尝试访问私有属性吗?
答案 0 :(得分:1)
答案很简单。如果您在var_dump
对象上执行$poppy
输出,您会注意到无论如何它将输出test
的原因。
object(poodle)[1]
private 'Name' (dog) => null
public 'Name' => string 'test' (length=4)
PHP是一种基于动态类型的语言,可以在运行时分配变量,而无需先声明空间。由于属性$Name
不存在于对象poodle
中(在类狗中,您声明它私有使其不可用于继承),因此它创建(声明)一个即时(默认情况下,不存在的变量变为 public )。
这给出了错觉,好像对象$Name
的属性$dog
确实已设置。