& $ variable в PHP

Я просматривал основные файлы wordpress и наткнулся на этот фрагмент кода, я заметил, что у него есть амперсанд перед именем переменной и после =.

Я попытался найти это и натолкнулся на это из руководства PHP, и он не объясняет это хорошо, или я смотрю на неправильный! Я также видел, что он используется для изменения переменной за пределами метода, в котором она используется, но для чего нужна переменная, которая должна быть изменена, если это правильно, как использовать ее?

function _make_cat_compat( &$category ) { if ( is_object( $category ) ) { $category->cat_ID = &$category->term_id; $category->category_count = &$category->count; $category->category_description = &$category->description; $category->cat_name = &$category->name; $category->category_nicename = &$category->slug; $category->category_parent = &$category->parent; } elseif ( is_array( $category ) && isset( $category['term_id'] ) ) { $category['cat_ID'] = &$category['term_id']; $category['category_count'] = &$category['count']; $category['category_description'] = &$category['description']; $category['cat_name'] = &$category['name']; $category['category_nicename'] = &$category['slug']; $category['category_parent'] = &$category['parent']; } } 

Это означает, что функция будет изменять аргумент (по ссылке), вместо этого работая над его копией. Удалите все амперсанды внутри тела функции, необходимо только одно в аргументе.

 function foo(&$foo) { $foo++; } function bar($foo) { $foo++; } $foo = 10; foo($foo); foo($foo); // prints 12, function foo() has incremented var $foo twice echo "$foo\n"; bar($foo); // still 12, as bar() is working on a copy of $foo echo "$foo\n"; // However, since PHP 5.0, all objects are passed by reference [(or to be more specific, by identifier)][1] class Foo { public $bar = 10; } $obj = new Foo; echo "$obj->bar\n"; // 10, as expected function objectIncrement($obj) { $obj->bar++; } function objectRefIncrement(&$obj) { $obj->bar++; } objectIncrement($obj); echo "$obj->bar\n"; // 11, as expected, since objects are ALWAYS passed by reference (actually by identifier) objectRefIncrement($obj); echo "$obj->bar\n"; // 12 

Это по-прежнему хорошая идея, если вы намерены изменить переданный аргумент в функции / методе, чтобы явно передать его по ссылке. Помимо других преимуществ, ваш код также становится более явным и понятным.

Кстати, вы можете это сделать:

 function _make_cat_compat( &$category ) { if (is_array( $category)) { $category = (object)$category; } $category->cat_ID = $category->term_id; $category->category_count = $category->count; $category->category_description = $category->description; $category->cat_name = $category->name; $category->category_nicename = $category->slug; $category->category_parent = $category->parent; } 

Выглядит мне чище, но я не знаю вашего конкретного случая. И я не знаю, как у вас будет массив или объект – это подразумевает использование некоторых плохих методов.

Говоря о параметрах метода, &$variable относится к call by reference . Поэтому любое изменение, которое вы вносите в эту переменную, остается даже в том случае, если этот метод выполнен.

 function a($arg) // call by value ($arg is a copy of the original) { $arg += 1; } function b(&$arg) // call by reference ($arg IS the original) { $arg += 1; } $myArg = 1; a($myArg); echo $myArg; echo "\r\n"; b($myArg); echo $myArg; // Displays: // 1 // 2 

Вот раздел руководства PHP о ссылках.

Значения & after = основном означают одно и то же, но в этом контексте они бесполезны, потому что у вас уже есть вызов по ссылке. Вы можете безопасно удалить их.

Вот правильная запись в PHP по ссылкам: http://php.net/manual/en/language.references.php

В большинстве случаев вам не нужно передавать ссылку с помощью амперсанда & поскольку PHP всегда будет сначала передавать ссылку и только создать копию переменной при первом доступе на запись.

Он передает переменную в качестве ссылки. Без амперсанда следующий код не будет работать:

 $var = "content"; function test(&$v) { $v = "this is new content"; } test($var); 

ПРИМЕЧАНИЕ: это непроверенный код, но теория достаточно близка. Он позволяет изменять переменную из другой области, поэтому вместо того, чтобы передавать значение переменной, в этом примере – «контент», вы передаете ссылку на самую переменную, так что вы непосредственно редактируете переменную, которую вы передали ,

Это s because this function doesn ничего s because this function doesn возвращает, просто модифицирует и все.