2012-07-10 17 views
2

我適應一個非常簡單的View類從Controller變量傳給View這樣在View我可以調用變量直接例如有趣的現象這

<?php echo $name; ?> 

和不

<?php echo $this->name; ?> 

所有視圖VARS被存儲在一個所謂的關聯數組瓦爾例如$vars['name'] = "test"並且具有__set函數設置以分配變量例如

$v = new View; 
$v->name="test"; 
$v->out(); 
其中經過變量和包括I加入視圖HTML的 out()功能

所以:

foreach($this->vars as $key=>$val) { 
     $$key=$val; 
    } 
include $this->view_file; 

然後我測試,如果我在模板中使用$this並加入等對應的變量會發生什麼

$v->this = "test_this"; 

我的假設是,無論是代碼將失敗,因爲$this不能重新分配或EV恩,如果它重新分配 - see here - 因爲$this已被重新分配,從而

include $this->view_file; 

將無法​​正常工作的代碼將失敗!

而是,它的工作。 $this,直接使用echo $this;var_dump($this);等於​​,但$this->view_file仍然指向原始值!

這是怎麼回事?

然後我使用extract($this->vars, EXTR_OVERWRITE)$this重新測試沒有得到感動!

在一般情況下,什麼是正確的做法將變量傳遞到視圖和避免碰撞的功能

function out($view, $toString = false) 
{ 
    extract($this->vars); 
    include $view; 
} 

和VAR可能有一個變種稱爲視圖或「本」或可能的模板將使用$view var。

  1. 不要擔心,只要確保不要指定一個叫做view的var。
  2. out()函數中使用長變量名稱,如$longVarNameSoThatThereWillNotBeCollisions
  3. 分配所需要的功能,$this->temp所有增值經銷商:$this->temp['view'],然後unset($view) - 並以此爲$this - 誰在心智正常的人會在View使用一個名爲$this變量!
+6

有沒有這個問題,或者你只是在咆哮? – 2012-07-10 14:42:10

+2

感謝您修復格式 - 我在中間,您首先到達那裏!問題是:$ this指向「test_this」,$ this-> view_file指向「view.html.php」? – neyl 2012-07-10 14:43:26

回答

4

要解釋爲什麼你仍然能夠訪問一個對象的屬性,即使你已經成功地規避重新分配$this保護,您必須查看爲編譯腳本生成的操作碼。

使用FETCH_OBJ_R操作碼訪問對象屬性。

當你寫的代碼,如

$myObject = new testClass; 
$myObject->property 

編譯的代碼參數生成FETCH_OBJ_R。第一個是包含該對象的變量,第二個是該屬性的名稱。

如果使用火神反彙編器,輸出可能如下所示:

FETCH_OBJ_R          $1  !1, 'property' 

$1是在返回值存儲,並!1是包含對象的變量。

但是,如果您使用$this訪問該屬性,則生成的輸出會稍有不同。

FETCH_OBJ_R          $1  'property' 

帶有一個參數的操作碼解析了從其中被調用的對象的屬性查找。

因此,您的問題的答案$this->property已在編譯時解決。即使你打破了$thisproperty的位置已經決定。

+0

謝謝!其他(隱含的)問題呢:爲什麼$這隻會被$$ key = $ val覆蓋,而不會被extract()覆蓋?我的假設只是提取函數檢查它不應該覆蓋$ this - 也許你(作爲低級程序員)可以在php源代碼中查看 – neyl 2012-07-10 15:37:34

+1

@neyl:'extract'專門檢查'this'(和' GLOBALS')。你可以在['ext/standard/array.c'](http://lxr.php.net/xref/PHP_5_4/ext/standard/array.c#1394) – Leigh 2012-07-10 15:43:02

0

這對我有點感興趣,看起來你是對的,在使用變量賦值給$this時可能會有一個錯誤。

正如你所說的那樣:

<?php 
$var = 'this'; 
$$var = 'hello'; 

echo $this; 

作品,而

<?php 
$this = 'hello'; 

echo $this; 

沒有。

也許在bugs.php.net上報告它,看看是否有官方的答案?

說的$this現有成員仍同時的$this實際價值的工作其實是完全不同的東西絕對不能發生的,並且必須是某種形式的核心問題。我唯一能想到的就是不知何故$this被用作一個神奇的上下文變量(當然這並不奇怪,這是PHP的後遺症!)而不是真正的「真正的」變量。來自變量變量的分配錯誤(顯然而不是發生!)允許$this是一個虛假變量以顯示給開發人員。

魔術性測試:

<?php 

class ThisTest { 
    public function SetAndUseThis() { 
     $var = 'this'; 
     $$var = 'that'; 
     var_dump($this); 
     var_dump($this->variable); 
     var_dump($this->AnotherMethod()); 
    } 

    public $variable = 'i am a variable'; 

    public function AnotherMethod() 
    { 
     return 9.0; 
    } 
} 

$inst = new ThisTest(); 
$inst->SetAndUseThis(); 

結果:

string(4) "that" string(15) "i am a variable" float(9)