2012-02-13 2 views
0

Мне интересно этот вопрос в течение длительного времени, как PHP обрабатывать ссылки, они являются хорошей идеей для использования, и я не могу объяснить лучше, чем использовать пример, давайте посмотрим на следующий класс, а затем на @ комментарий метода setResult.Ссылки на PHP-память

Давайте предположим, что мы используем структуру управления представлением модели, и мы строим базовый AjaxController, до сих пор мы получили только 1 метод действий (getUsers). Прочитайте комментарии, и я надеюсь, что мой вопрос ясен, как PHP обрабатывает такие ситуации, и верно ли это то, что я написал о x раз в памяти @ setResult docblock.

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); 
    } 
} 

Еще один простой пример: Что бы лучше использовать метод A:

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

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

Или метод Б:

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

ответ

2

В short: не используйте ссылки.

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

+0

@MikeVercoelen, ваш второй пример, где вы установили что-то, на что ссылались, является подходящим использованием ссылок, потому что вам нужны эти функции для обновления исходных данных. Из-за этого не будет ускоряться в какой-либо заметной форме, поэтому не используйте его. Кроме того, когда вы закончите с ссылкой, вы должны 'unset()' it, чтобы избежать повторного использования позже. И я понимаю, что этот пример был изобретен, но, как правило, лучшим решением является избежать таких сложных вложенных массивов. Обычно это означает, что объект более уместен, что уменьшит необходимость в ссылках. – Matthew

+0

Если вы оказались в ситуации, когда такой сложный массив уместен, тогда я бы предпочел использовать ссылку в качестве примера, потому что она устраняет ошибки копирования/вставки. Но эта часть ответа - это в основном мнение, с которым люди могут свободно не соглашаться. – Matthew

Смежные вопросы