似乎我能够直接从PHP中的实例为类创建属性?
在下面的程序中,最后一条语句echo$objb->test;不应输出任何值。最后一条语句应该抛出一个错误,指出无法访问私有成员。但是,在运行程序时,我得到的输出是20 由于PHP是松散类型的语言,$objb在类之外创建一个新变量似乎我能够直接从PHP中的实例为类创建属性?,php,Php,在下面的程序中,最后一条语句echo$objb->test;不应输出任何值。最后一条语句应该抛出一个错误,指出无法访问私有成员。但是,在运行程序时,我得到的输出是20 由于PHP是松散类型的语言,$objb在类之外创建一个新变量 <?php error_reporting(E_ALL); class A { public $a; private $test; protected function sayhello(){
<?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;
?>
输出
我得到了输出20为什么它能工作?因为您正在用childs类的公共属性覆盖父类的私有属性 它在PHP中是有效的 尝试在
类别B
中添加新的私有属性$c
,并尝试覆盖它
您将收到一个错误:致命错误:无法访问私有属性B::$c
检查此处:由于
$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();
因为它不是在父(A)类中声明的
test
变量。事实上,its将其视为public$test代码>为B类。检查以下内容,您将获得问题
<?php
error_reporting(E_ALL);
class A {
public $a;
private $test;
protected function sayhello(){
echo "<p>hello class A</p>";
}
public function setTest(){
$this->test = "50";
}
}//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->setTest();
echo $objb->test;
?>
因为您可以在扩展类中创建公共属性,以覆盖父类中的私有属性。。。。私有的$test
仅存在于A
中定义的方法的上下文中,因此您可以在扩展A
的任何类中创建新的$test
属性。这意味着我可以直接从对象本身创建一个属性,它在PHP中是有效的。
<?php
error_reporting(E_ALL);
class A {
public $a;
private $test;
protected function sayhello(){
echo "<p>hello class A</p>";
}
public function setTest(){
$this->test = "50";
}
}//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->setTest();
echo $objb->test;
?>