Нужно ли мне больше использовать Ampersand в PHP 5.5.x и выше?

StackOverflow https://stackoverflow.com/questions/19847781

Вопрос

Я получаю смешанные сигналы повсюду.

Я использую Ampersand для передачи переменных по ссылке или нет?

Следующая ссылка, кажется, говорит мне, что она устарела и больше не нужна:
http://gtk.php.net/manual/en/html/tutorials/tutorials.changes.references.html

Но такие темы заставляют меня задуматься:
Время вызова
PHP и Ampersand

Позвольте мне формулировать мой вопрос в качестве примера.

Если я сделаю функцию, используя PHP 5.5.5:

function recurring_mailer_form($form, $form_state) 
{

}

Это то же самое, что:

function recurring_mailer_form($form, &$form_state) 
{

}

?

Это было полезно?

Решение

Похоже, что разные статьи говорят о том, что они говорят о разных видах прохождения.

Главное, что определяет, должен ли параметр быть передан с помощью ссылки, - это сама подпись функции, и основы этого не изменились с момента PHP 4. Рассмотрим этот пример:

function foo( $by_value, &$by_reference ) { /* ... */ }

$a = 1; $b = 2;
foo( $a, $b );

Здесь внешняя переменная $a передается функции по значению, как будто она назначается как $by_value = $a; - изменения в $by_value не может повлиять $a. Анкет Переменная $b Однако проходит по ссылке; точно так же, как задание формы $by_reference =& $b; Это означает, что есть одна переменная, на которую ссылается два имена, и любое назначение одному будет выступать в качестве назначения обоим.

Если вы передаете «обычное» значение (строка, число или массив) по значению, его значение просто скопируется в новую переменную. По состоянию на Php 5: Однако, если вы передаете объект по значению, происходит что -то немного другое - скопированное «значение» - это просто указатель на один и тот же объект. Это означает, что если $a были объектом, вы могли бы позвонить $by_value->some_property = 42; а также $a->some_property также будет 42. Анкет Однако, если вы назначили новое значение $by_value, это все равно не повлияет $a.

До PHP 5.4, это был дополнительный Способ пройти параметр по ссылке, который должен был «заставить» справочное поведение во время вызова. Анкет Это означало, что вы могли бы написать foo(&$a, &$b); и «захват» изменения, внесенные в $by_value внутри foo() функция Полагаться на это было в целом плохой идеей, и поэтому она была удалена. (Он приземлился в 5,4, потому что он был предназначен для удаления в PHP 6, но этот проект был поставлен на неопределенное удержание, причем меньшие изменения приземлялись в 5,3 и 5,4).

Наконец, функции могут возвращаться переменная по ссылке (как обсуждается в руководстве здесь) Это немного жестко, так как это действительно требует от вас, чтобы положить & в два Места: в начале объявления функции, чтобы сказать, что return должен означать «вернуть эту ссылку на переменную», а не «вернуть это значение»; и в коде вызове его, чтобы назначить переменную этой ссылке, а не просто копировать ее значение. Вот глупый пример, который объединяет эталонный параметр с возвратом ссылки (эти два не должны идти вместе, это просто пример):

function &bar(&$some_param) { return $some_param; }
$a = 1;
$b =& bar($a);
// $b and $a now point at the same variable, not just the same value
// it was passed into and out of a function, and assigned to a new variable, 
// but all those operations were by reference

Обратите внимание, что многие люди по ошибке считают, что передача переменной по ссылке даст им выгоду от производительности, и это часто было их единственной причиной для использования времени вызовов. На самом деле это обычно неправильно, так как двигатель Zend, который Ph использованная литература. Фактически, ориентировочное назначение в целом поражения Эта оптимизация из-за того, как двигатель отслеживает, какие переменные находятся в состоянии копии на записи.

Другие советы

Нет.

  • Объекты всегда автоматически передаются в виде ссылок (Информация! См. Ниже для дополнительной важной информации!)

  • Объявление параметров как ссылки должны происходить в определении функции:

    function test(&$var) {}
    

    Нет во время называния этого:

    // wrong
    $var = '123';
    test(&$var);
    


Если вы передаете объект как обычно, вы можете изменить состояние объекта (свойства).
Предположить, что $obj это экземпляр класса TestClass который содержит переменную члена, называемую hello (Нажмите здесь, чтобы получить полный образец на iDeone.com):

function modify($obj) { $obj->hello = 'world (modified)!'; }

$obj->hello = 'world';
modify($obj);
var_dump($obj->hello);  // outputs "world (modified!)"

Это должно быть самоэкспланирующим. Теперь используя тот же код, но присвоение другому значению $obj Вместо этого изменение состояния объекта не приводит к отсутствию модификации (→ Ideone.com):

function modify($obj) { $obj = 42; }
// ...
var_dump($obj->hello);  // outputs "world"

Только принятие параметра явно в качестве ссылки дает нам возможность полностью изменить содержимое переменной (→ Ideone.com):

function modify(&$obj) { $obj = 42; }
// ...
var_dump($obj);         // outputs "42"

Нет, это не то же самое. PHP 5.4+ просто обнаруживает на вызове, необходима ли ссылка, когда функция вызывается путем проверки объявления.

Так что нет, не устарело, поскольку вам нужен справочный оператор в объявлении функции, если это ваше предполагаемое использование.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top