2012-02-13 53 views
0

我很長一段時間想知道這個問題,PHP如何處理引用是他們的一個好主意,我不能解釋比使用示例更好,讓我們看看下面的類,然後@ setResult方法的註釋。讓我們想象我們正在使用模型視圖控制器框架,並且我們正在構建基本的AjaxController,到目前爲止我們只有1個操作方法(getUsers)。閱讀評論,我希望我的問題很清楚,PHP如何處理這種情況,並且是我在內存@ setResult docblock中寫了x次的真實情況。PHP內存引用

class AjaxController{ 
    private $json = array(
     'result' => array(), 
     'errors' => array(), 
     'debug' => array() 
    ); 

    /** 
    * Adds an error, always displayed to users if any errors. 
    * 
    * @param type $description 
    */ 
    private function addError($description){ 
     $this->json['errors'][] = $description; 
    } 

    /** 
    * Adds an debug message, these are displayed only with DEBUG_MODE. 
    * 
    * @param type $description 
    */ 
    private function addDebug($description){ 
     $this->json['debug'][] = $description; 
    } 

    /** 
    * QUESTION: How does this go in memory? Cause if I use no references, 
    * the array would be 3 times in the memory, if the array is big (5000+) 
    * its pretty much a waste of resources. 
    * 
    * 1st time in memory @ model result. 
    * 2th time in memory @ setResult ($resultSet variable) 
    * 3th time in memory @ $this->json 
    * 
    * @param array $resultSet 
    */ 
    private function setResult($resultSet){ 
     $this->json['result'] = $resultSet; 
    } 

    /** 
    * Gets all the users 
    */ 
    public function _getUsers(){ 
     $users = new Users(); 
     $this->setResult($users->getUsers()); 
    } 

    public function __construct(){ 
     if(!DEBUG_MODE && count($this->json['debug']) > 0){ 
      unset($this->json['debug']); 
     } 

     if(count($this->json['errors']) > 0){ 
      unset($this->json['errors']); 
     } 

     echo json_encode($this->json); 
    } 
} 

另一個簡單的例子:什麼是更好地使用技術答:

function example(){ 
    $latestRequest = $_SESSION['abc']['test']['abc']; 

    if($latestRequest === null){ 
     $_SESSION['abc']['test']['abc'] = 'test'; 
    } 
} 

或技術B:

function example(){ 
    $latestRequest =& $_SESSION['abc']['test']['abc']; 

    if($latestRequest === null){ 
     $latestRequest = 'test'; 
    } 
} 

感謝您的閱讀,並建議:)

+1

PHP手冊頁的參考:[http://php.net/manual/en/language.references.php](http://php.net/manual/en/language.references.php) – bfavaretto 2012-02-13 19:20:14

回答

2

在簡而言之:不要使用引用。

寫入PHP副本。考慮:

$foo = "a large string"; 
$bar = $foo; // no copy 
$zed = $foo; // no copy 
$bar .= 'test'; // $foo is duplicated at this point. 
       // $zed and $foo still point to the same string 

當您需要它們提供的功能時,應該只使用引用。即,您需要通過對其的引用來修改原始數組或標量。

+0

謝謝你你的回答,我現在明白了。我剛剛添加了另一個例子,如果你能看一看,並告訴我哪種技術更好用,那將是非常棒的。再一次,謝謝:) – randomKek 2012-02-13 19:53:03

+0

@MikeVercoelen,你設置被​​引用的東西的第二個例子是引用的適當用法,因爲你需要這個功能來更新原始數據。它不會以任何明顯的方式加快速度,所以不要因此使用它。另外,當你完成一個引用時,你應該'unset()'以避免以後意外重複使用它。我意識到這個例子是人爲設計的,但通常更好的解決方案是完全避免這種複雜的嵌套數組。通常這意味着一個對象更合適,這將減少對refs的需求。 – Matthew 2012-02-13 20:04:38

+0

如果您發現自己處於這樣一個複雜數組適合的情況,那麼我會傾向於使用參考,因爲您的示例只是因爲它消除了複製/粘貼錯誤。但這部分答案基本上是人們可以自由反對的一種觀點。 – Matthew 2012-02-13 20:09:19