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

use*_*634 7 php

在下面的程序中最后一个语句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为什么它工作?

Bar*_*mar 1

由于该$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)