Символ в PHP, с которым я никогда не сталкивался - PullRequest
3 голосов
/ 07 декабря 2009

Я, наверное, должен был, но я никогда не видел этого раньше. Наткнулся на него, просматривая документацию Smarty Plugin.

$smarty =& new Smarty;

Знак = & в частности. Если вы введете его в Google, он будет игнорироваться, как и любая другая поисковая система. Для чего это используется?

То же самое касается сигнатуры этой функции:

function connect(&$smarty, $reset = false)

Почему символ &? 1009 *

Ответы [ 8 ]

16 голосов
/ 07 декабря 2009

На самом деле этот код написан для совместимости с PHP 4. Амперсанд бесполезен в PHP 5 (как сказал Тим - начиная с PHP 5, все объекты передаются по ссылке).

В PHP 4 все переменные были переданы по значению. Если вы хотели передать его по ссылке, вы должны были объявить присвоение ссылки:

$ref_on_my_object =& new MyObject();

Этот код все еще принимается с конфигурацией по умолчанию PHP 5, но лучше написать:

$ref_on_my_object = new MyObject(); // Reference assignment is implicit

Что касается вашей второй проблемы, проблема почти такая же ... Потому что PHP позволяет вам объявлять аргументы функций (соответственно, типы), а вы не можете сделать это для возвращаемых значений. Принятая, но "не очень хорошая" практика - избегать ссылочного объявления в объявлении функции:

function foo($my_arg) {    
    // Some processing
}

и позвонить со ссылкой ...

$my_var;
$result = foo( &$my_var );
// $my_var may have changed because you sent the reference to the function

Идеальная декларация будет больше похожа на:

function foo( & $my_input_arg ) {    
    // Some processing
}

тогда вызов теряет амперсанд:

$my_var;
$result = foo( $my_var );
// $my_var may have changed because you sent the reference to the function
4 голосов
/ 07 декабря 2009

& передает аргумент по ссылке . Таким образом, connect() может манипулировать объектом $smarty, чтобы вызывающая функция могла извлечь измененный объект.

Аналогично, =& устанавливает переменную по ссылке.

3 голосов
/ 07 декабря 2009

Как сказал Тим, это ссылка на переменную. Но если вы используете последнюю версию PHP, тогда все объекты класса все равно передаются по ссылке Это все равно понадобится, если вы передаете массивы или другие встроенные типы.

2 голосов
/ 07 декабря 2009

Первый пример возвращает ссылку, второй передает ссылку.

Вы можете прочитать все об этом в руководстве PHP

1 голос
/ 07 декабря 2009

& является оператором ссылки PHP. Используется для возврата ссылки на объект. В данном случае «новый ум».

0 голосов
/ 07 декабря 2009

Одним из основных применений оператора амперсанда является передача по адресу памяти. Обычно это то, что вы делаете, когда хотите, чтобы переменная была изменена, но не возвращалась.

function test_array(&$arr)
{
    $varr[] = "test2";
}
$var = array('test');
test_array($var);

print_r($var);

this should output

array( test , test2 );

Целью этого обычно является передача фактической копии [адрес памяти], с которой вы работаете, в другую функцию / объект. Обычно это использовалось в прошлом, чтобы восполнить нехватку памяти и повысить производительность, это особенность C / C ++ и некоторых других языков низкого уровня.

0 голосов
/ 07 декабря 2009

Амперсанд назначит ссылку на переменную, а не значение объекта.

...