似乎我能够直接从PHP中的实例为类创建属性?

似乎我能够直接从PHP中的实例为类创建属性?,php,Php,在下面的程序中,最后一条语句echo$objb->test;不应输出任何值。最后一条语句应该抛出一个错误,指出无法访问私有成员。但是,在运行程序时,我得到的输出是20 由于PHP是松散类型的语言,$objb在类之外创建一个新变量 <?php error_reporting(E_ALL); class A { public $a; private $test; protected function sayhello(){

在下面的程序中,最后一条语句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;
    ?>

输出
我得到了输出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;
    ?>