2013-01-09 49 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

我認爲,也許如果變量是在一個私人函數中定義它將是私人的。 –