Php равно перед переменной

Символ & перед переменной в php

Это ссылка. На самом деле символ относится к оператору =>& . Если в теле цикла вы присвоите новое значение переменной $node , то оно сохранится в массиве $this->data . Очень часто это не нужно, поскольку используется механизм COW, если только вы действительно не планируете менять элементы массива в цикле.

@AlexanderZonov Хм.. т.е. это избавит от конструкции в теле цикла типа $this->data[$id]=. , если бы я переназначал значения этого массива?

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

@ВоробьевАлександр, наоборот, использование явных ссылок может вести к потери производительности из-за того, что сработает copy on write для самого массива.

1 ответ 1

У вас есть два варианта цикла:

foreach ($this->data as $id => $node) <> 
foreach ($this->data as $id =>& $node) <> 

Разница только лишь в возможности во втором случае изменить элемент массива $node простым присвоением $node = 123 .

Никакого замедления или копирования данных, если не используются ссылки, не происходит, поскольку PHP использует механизм Copy-on-Write. В варианте цикла без ссылки программисту просто запрещается использовать ссылку, но внутри движка PHP она все так же имеет место.

Читайте также:  List comprehension python условия

Источник

Оператор присваивания

Базовый оператор присваивания обозначается как «=». На первый взгляд может показаться, что это оператор «равно». На самом деле это не так. В действительности, оператор присваивания означает, что левый операнд получает значение правого выражения, (т.е. устанавливается значением).

Результатом выполнения оператора присваивания является само присвоенное значение. Таким образом, результат выполнения «$a = 3» будет равен 3. Это позволяет делать трюки наподобие:

$a = ( $b = 4 ) + 5 ; // $a теперь равно 9, а $b было присвоено 4.

Для массивов ( array ), присвоение значения именованному ключу происходит с помощью оператора «=>». Приоритет этого оператора такой же, как и у остальных операторов присваивания.

В дополнение к базовому оператору присваивания имеются «комбинированные операторы» для всех бинарных арифметическихопераций, операций объединения массивов и строковых операций, которые позволяют использовать некоторое значение в выражении, а затем установить его как результат данного выражения. Например:

$a = 3 ;
$a += 5 ; // устанавливает $a в 8, как если бы мы написали: $a = $a + 5;
$b = «Hello » ;
$b .= «There!» ; // устанавливает $b в «Hello There!», как и $b = $b . «There!»;

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

Исключением из обычного для PHP способа присваивания по значению являются объекты ( object ), которые, начиная с версии PHP 5, присваиваются по ссылке. Принудительно скопировать объекты по значению можно с помощью специального ключевого слова clone.

Присваивание по ссылке

Присваивание по ссылке также поддерживается, для него используется синтаксис $var = &$othervar; . ‘Присваивание по ссылке’ означает, что обе переменные указывают на одни и те же данные и никакого копирования не происходит.

Пример #1 Присваивание по ссылке

print » $a \n» ; // печатает 3
print » $b \n» ; // печатает 3

print » $a \n» ; // печатает 4
print » $b \n» ; // также печатает 4, так как $b является ссылкой на $a,
// а значение переменной $a успело измениться
?>

Начиная с версии PHP 5, оператор new автоматически возвращает ссылку, поэтому присваивание результата операции new по ссылке начиная с версии PHP 5.3 генерирует ошибку уровня E_DEPRECATED , а в более ранних версиях — ошибку уровня E_STRICT .

Например, следующий код выдаст предупреждение:

/* Следующая строка сгенерирует следующее сообщение об ошибке:
* Deprecated: Assigning the return value of new by reference is deprecated in.
* (Устаревший код: Присвоение результата работы new по ссылке устарело в. )
*/
$o = &new C ;
?>

Для получения более полной информации о ссылках и их возможностях обратитесь к разделу Подробно о ссылках.

Источник

Php равно перед переменной

Ссылки в PHP позволяют ссылаться на область памяти, где расположено значение переменной или параметра. Для создания ссылки перед переменной указывается символ амперсанда — & . Но перед рассмотрением ссылок сначала рассмотрим простой пример копирования переменных:

"; // tom = Tom echo "sam = $sam"; // sam = Sam ?>

Здесь переменной $sam присваивается значение переменной $tom («Tom»). Затем той же переменной $sam присваивается новое значение — «Sam». Результат программы ожидаем — обе переменные имеют различные значения:

Теперь при копировании значения переменных передадим ссылку:

"; // tom = Sam echo "sam = $sam"; // sam = Sam ?>

Здесь нас интересует выражение

В данном случае переменной $sam передается не копия значения переменной $tom , как в предыдущем случае, а ссылка на область в памяти, которую занимает переменная $tom . То есть после выполнения инструкции

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

Присвоить ссылку на переменную можно двумя способами:

Передача по ссылке

В примере в прошлых темах мы передавали параметры по значению . Но в PHP есть и другая форма передачи параметров — по ссылке . Рассмотрим два этих способа передачи параметров и сравним. Стандартная передача параметра по значению:

 $number = 5; square($number); echo "
number = $number"; ?>

В данном случае внутри функции square() значение параметра $a возводится в квадрат. То есть значение параметра внутри функции изменяется. Однако после вызова функции square() значение переменной $number , которое передается параметру $a, не изменится. Это и есть передача по значению, она никак не затрагивает переменную $number .

Теперь рассмотрим передачу параметра по ссылке:

 $number = 5; square($number); echo "
number = $number"; ?>

При передаче по ссылке перед параметром ставится знак амперсанда: function square(&$a) . Теперь интерпретатор будет передавать не значение переменной, а ссылку на эту переменную в памяти. То есть теперь и переменная $number и параметр $a будут указывать на одну и ту же область в памяти. В итоге, значение переменной $number после передачи параметру &$a также будет изменено.

Возвращение ссылки из функции

Функция также может возвращать ссылку. В этом случае при определении и вызове функции перед ее именем ставится знак амперсанда:

 $userName = "admin"; $checkedName = &checkName($userName); echo "
userName: $userName"; echo "
checkedName: $checkedName"; ?>

В данном случае функция checkName() получает параметр по ссылке и возвращает ссылку — фактически ссылку, которая передается в функции. Для этого перед определением функции указан символ амперсанда:

Для имитации работы функция проверяет имя пользователя и изменяет его на некоторое стандартное, если оно равно «admin».

При вызове функции перед ее именем указывается символ амерсанда:

После выполнения функции переменная $checkedName фактически будет содержать ссылку на переменную $userName .

Источник

Php равно перед переменной

Все содержание этой заметки в общем-то будет построено вокруг одного символа — & или амперсанд. А связано это с тем, что этот символ имеет в PHP смысл оператора, под которым подразумевается какое-то действие (как, например, знак $, означающий начало переменной). И дословно это действие звучит как «передача данных по ссылке». Согласен, звучит немного не понятно, особенно когда вы только в начале пути изучения PHP. Поэтому я расскажу о смысле этого символа более развернуто и понятно.

Для чего нужен амперсанд в PHP?

Опираясь на официальную документацию по PHP, & (амперсанд) в PHP — это передача переменной по ссылке, о чем я уже упоминал. Можно почитать эту документацию, попытаться вникнуть, тем более сейчас там появилась русская версия, но я все-таки попытаюсь рассказать более подробно и понятно.

Вообще я пытаюсь все время опираться на 2 вещи — официальные источники и практику. Даже если какие-то полезные статьи получается находить в интернете, то из них берутся только основы, а их содержание перетекает в практику и проверку этого в реальных условиях. Поэтому советую Вам в первую очередь смотреть официальную документацию, а потом практиковать это все в живую. К сожалению, на начальном уровне не вся официальная документация позволяет осознать то, что там написано, поэтому появляется необходимость в заметках вроде моей. Вернемся же к ссылкам в PHP.

Возьмем для пример объявление простой переменной на PHP:

Логика тут проста: в PHP создается переменная $testVar и в нее записывается нужное значение (можно провести аналогию с контейнером, в который можно положить хоть что; каждая новая переменная при этом — отдельный контейнер).
Но что будет, если мы это чуть усложним и добавим символ &.

$testVar = "test text"; //то же самое, что и выше //ставим ссылку на $testVar для переменной $otherV $otherV = &$testVar; //теперь $otherV выведет значение "test text"

Берет, ставит ссылку и дублирует значение — вроде бы понятно. Но возникает интересный вопрос — в чем разница между

$otherV = &$testVar и $otherV = $testVar

ведь и в том и в другом случае $otherV выведет значение «test text». И для ответа на него рассмотрим пример, озвученный в официальной документации:

//обратите внимание, что функция работает НЕ с новой переменной $var, //а с ссылкой &$var, в нашем случае ссылка на $a function foo(&$var) < //прибавляем единицу для проверки, что изменится $var = $var+1; >$a=5; foo($a); //теперь в переменной $a значение будет равно уже 6

То есть внутри функции foo() мы изменяли $var, а поменялась $a. И это не магия, это смысл ссылки &$var, которая просто является промежуточным звеном между основной переменной и необходимыми действиями .

Уберите этот символ & перед $var — в конце кода вы увидите, что $a останется = 5, так как в данном случае $var будет уже новой переменной со значением 5 (закованной внутри функции) и её изменения никак не затронут $a.

Ошибка «Fatal error: Call-time pass-by-reference has been removed in . on line XXX»

Мы подобрались к проблеме, которая появилась в PHP 5.4+ версии. Как вы догадываетесь — её суть все в том же символе & (амперсанд), который задает, является ли данная переменная ссылкой на другую переменную или нет.

Возьмем для примера ту же функцию, что чуть выше:

Тут показано правильное использование амперсанда (при объявлении переменных функции). Этот пример будет работать БЕЗ ошибки.

Но для возникновения критической ошибки «Fatal error: Call-time pass-by-reference has been removed in . » достаточно сделать вот так:

function foo(&$var) < $var = $var+1; >$a=5; foo(&$a);//ошибка в этом месте, нельзя прописывать ссылку на этом этапе

То есть при вызове функции foo() указана ссылка и это НЕ правильно и приводит к ошибке. Для устранения ошибки достаточно убрать символ & из вызова функции, то бишь заменить:

На этом вроде бы все. Теперь, я думаю, должно появиться общее понятие о том, для чего нужен & (амперсанд) в PHP, а так же о том, как исправить или не допустить фатальную ошибку «call-time pass-by-reference has been removed in . «. Не ленитесь экспериментировать и опирайтесь на официальную документацию.

Виталий Жуков 22.04.2015

Источник

Оцените статью