2013-01-24 3 views
2

Я очень смущен о том, как использовать & Оператор для уменьшения памяти.= & operator, memories

Могу ли я получить ответ на вопрос ниже?

clase C{ 

    function B(&$a){ 
     $this->a = &$a; 

     $this->a = $a; 

     //They are the same here created new variable $this->a?? 
     // Or only $this->a = $a will create new variable? 
    } 
} 

$a = 1; 

C = new C; 
C->B($a) 

Или, может быть, мое понимание совершенно неправильно .....

+1

http://php.net/manual/en/language. reference.pass.php – user1909426

+1

Угадайте, что вам не нужно '&' вообще. – KingCrunch

ответ

12

Никогда не используйте ссылки в PHP просто для уменьшения загрузки памяти. PHP отлично справляется с его внутренней копией при записи механизма. Пример:

$a = str_repeat('x', 100000000); // Memory used ~ 100 MB 
$b = $a;       // Memory used ~ 100 MB 
$b = $b . 'x';     // Memory used ~ 200 MB 

Вы должны использовать только ссылки, если вы точно знаете, что вы делаете, и нужно их функциональности (и почти никогда, так что вы могли бы, а просто забыть о них). Ссылки PHP являются изворотливыми и могут привести к неожиданному поведению.

+0

Большое спасибо !!!!! – Till

3

переменные типа Значение будут скопированы только тогда, когда их значение изменяется, если вы только назначить его в вашем примере это обыкновение быть скопирована, память след будет таким же, как если бы вы не использовали оператора &.

Я рекомендую вам прочитать эти статьи о передаче значений по ссылке:

When to pass-by-reference in PHP

When is it good to use pass by reference in PHP?

http://schlueters.de/blog/archives/125-Do-not-use-PHP-references.html

он считается microoptimalization, и ранит прозрачность кода

+0

спасибо! – Till

3

Я очень смущен о том, как использовать & Оператор, чтобы уменьшить количество воспоминаний.

Если вы не знаете, вы, вероятно, это не нужно :) & совершенно бесполезно в настоящее время, из-за нескольких усовершенствований в PHP-ядра в течение последних лет. Обычно вы должны использовать &, чтобы избежать того, что PHP копирует значение в память, выделенную для второй переменной, но вместо этого (короче говоря) пусть обе переменные указывают на одну и ту же память.

Но ныне

  • объекты передаются в качестве ссылки в любом случае. Они не клонировать сам себе волшебно, потому что они передаются методу;)
  • Когда вы передаете примитивные типы, PHP будет не скопировать значение, если вы не измените переменную (копирование при записи).

Подводя итог: преимущества & уже существует как функция ядра, но без уродливых побочных эффектов оператора

+0

Большое спасибо, поэтому использовать & или нет, в конце концов, использовать такое же количество воспоминаний? я понимаю это правильно? Извините ... – Till

+1

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Я использовал его только вчера для aliasing '$ itemTree [$ a] [$ b] [$ id]' to '$ items [$ id]', чтобы упростить ад зацикливания элементов. :) Но первое предложение является важным; если вы не знаете, что вы делаете с этим, вы почти наверняка не должны использовать его только для экономии памяти или чего-то еще. – cHao

+0

@ Досрочная оптимизация - это корень всего зла;) У вас действительно есть такое огромное использование памяти, что вы должны позаботиться об этом, и оно не разрешимо (например) кусками/разбиением на страницы? '&' является ссылкой, означает: если вы измените значение одной из переменных, то и другая будет изменена (потому что обе указывают на один и тот же 'zval' (« память »). и вы почти ничего не выигрываете. – KingCrunch

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