Php 动态变量不是私有的有什么原因吗?

Php 动态变量不是私有的有什么原因吗?,php,oop,class,dynamic,Php,Oop,Class,Dynamic,在运行时扩展类是可能的,我一直在尝试,但后来我偶然发现了这一点,这对我来说很奇怪。如果我在私有函数中定义一个新变量,它将成为一个公共变量。难道它至少应该得到保护吗 下面是我用来测试的代码: class FooBar { public function FooBar() { $this->t(); } public function createVariable() { $this->NewVar(); } private function NewVar() {

在运行时扩展类是可能的,我一直在尝试,但后来我偶然发现了这一点,这对我来说很奇怪。如果我在私有函数中定义一个新变量,它将成为一个公共变量。难道它至少应该得到保护吗

下面是我用来测试的代码:

class FooBar {

public function FooBar() {
    $this->t();
}

public function createVariable() {
    $this->NewVar();
}

private function NewVar() {
    $this->iam = "Hello you!";
}

private function t() {
    $this->T = "ballad";
    return $this->T;
}

}

$fb = new FooBar();
echo $fb->T;
echo "<br/>";
var_dump($fb);
$fb->createVariable();
echo $fb->iam;
echo "<br/>";
var_dump($fb);
echo "<br/>";
$fb->outer = "okay";
echo $fb->outer;

PHP允许在任何时候实例化变量,而无需显式定义它们

但是由于您没有明确定义变量,PHP不知道您希望如何定义它的作用域,而且您也无法告诉它,因此它只使用最安全的选项并将其公开


如果希望它的作用域是私有的,请在类定义中将其定义为私有变量。

为什么要这样做?关于你的第二个问题:这甚至不是有效的PHP…我知道它是无效的,这就是重点。如果我可以在运行时扩展我的类,为什么我不能决定它是否应该是公共的呢?您的第二个示例需要更改解析器,对于这样一个小问题,这似乎是不必要的。你应该“做对”而不是
private$anewvar;函数(){$this->anewvar=0;}
。属性重载更方便创建动态映射对象,例如在
stdClass
上映射JSON时。这也解释了为什么它是公共的:创建映射值对象然后不允许访问它是没有意义的;)如前所述:为真实案例创建真实类,而不是拼凑。旁边:仍然支持的
var$foo也创建公共属性;)我要说的是,我不是在宣传这个,我相信它在某些地方有它的用途。但我还没有到需要它的地步我想,如果变量是在私有函数中定义的,它可能是私有的。
function foo() {
    private $this->anewvar = 0; //private is illegal.
}