在下面的程序中最后一个语句echo $ objb-> test; 不应该输出任何值.第二个最后一个语句应该抛出一个错误,说无法访问私有成员.但是,我在运行程序时获得输出20.
由于PHP是松散类型的语言,因此$ objb在类外创建一个新变量...
<?php
error_reporting(E_ALL);
class A {
public $a;
private $test;
protected function sayhello(){
echo "<p>hello class A</p>";
}
}//end of class A
class B extends A {
//private $c;
public function sayhellonew(){
$this->sayhello();
echo "<p>hello class B</p>";
}
}//end of class B
$objb = new B();
$objb->sayhellonew();
$objb->a = 10;
echo $objb->a;
echo "<br>";
$objb->test = 20;
echo $objb->test;
?>
Run Code Online (Sandbox Code Playgroud)
输出 我得到输出20为什么它工作?
由于该$test属性是私有的A,因此它在 的范围内不可见B。这意味着B可以拥有自己的名为 的属性$test。当您分配时objb->test = 20,这就是您要设置的内容。
下面显示您实际上并未设置私有变量:
class A {
public $a;
private $test = 10;
protected function sayhello(){
echo "<p>hello class A</p>";
}
public function showTestA() {
echo "Test in A = " . $this->test . '<br>';
}
}//end of class A
class B extends A {
//private $c;
public function sayhellonew(){
$this->sayhello();
echo "<p>hello class B</p>";
}
public function showTestB() {
echo "Test in B = " . $this->test . '<br>';
}
}//end of class B
$objb = new B();
$objb->test = 20;
$objb->showTestA();
$objb->showTestB();
Run Code Online (Sandbox Code Playgroud)
这将显示:
Test in A = 10
Test in B = 20
Run Code Online (Sandbox Code Playgroud)