2013-01-09 47 views
1

在运行时可以扩展类,我一直在玩这个,但后来我偶然发现了这一点,这对我来说很奇怪。如果我在一个私有函数中定义一个新变量,它将变成一个公共变量。它不应该至少受到保护吗?是否有动态变量不是私有的原因?

下面是我用来测试这个代码:

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; 

而且作为一个额外的,因为它能够在运行过程来扩展类为什么不是这种可能:

function foo() { 
    private $this->anewvar = 0; //private is illegal. 
} 
+0

为什么要这样呢?关于你的第二个问题:这甚至不是有效的PHP ... – KingCrunch

+0

我知道这是无效的,这就是要点。如果我可以在运行时扩展我的课程,为什么我不能决定它应该公开还是不公开? –

+1

你的第二个例子将需要改变解析器,这对于这样一个小问题似乎是不必要的。你应该“做得对”而不是'private $ anewvar; function(){$ this-> anewvar = 0;}'。属性重载是创建动态映射对象的一个​​便利功能,例如,当您在'stdClass'上映射JSON时。这也解释了为什么它是公开的:创建映射的值对象,然后不允许访问它是没有意义的;)如前所述:为真实案例创建实际类而不是拼凑。除此之外:仍然支持'var $ foo;'也创建公共属性;) – KingCrunch

回答

2

PHP允许变量在任何时候被实例化,而不需要明确定义它们。

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

如果您希望将其作为私人范围,请在类定义中将其定义为私有变量。

+0

我认为,也许如果变量是在一个私人函数中定义它将是私人的。 –