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.
}
爲什麼要這樣呢?關於你的第二個問題:這甚至不是有效的PHP ... – KingCrunch
我知道這是無效的,這就是要點。如果我可以在運行時擴展我的課程,爲什麼我不能決定它應該公開還是不公開? –
你的第二個例子將需要改變解析器,這對於這樣一個小問題似乎是不必要的。你應該「做得對」而不是'private $ anewvar; function(){$ this-> anewvar = 0;}'。屬性重載是創建動態映射對象的一個便利功能,例如,當您在'stdClass'上映射JSON時。這也解釋了爲什麼它是公開的:創建映射的值對象,然後不允許訪問它是沒有意義的;)如前所述:爲真實案例創建實際類而不是拼湊。除此之外:仍然支持'var $ foo;'也創建公共屬性;) – KingCrunch