Как в php передаются ресурсы, по ссылке или по значению?
Как в php передаются ресурсы (один из 8-ми типов данных), по ссылке или по значению?
Есть ли это в документации?
Resource это специальная переменная, содержащая ссылку на внешний ресурс
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.6.7.43483
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Передаются ли переменные PHP по значению или по ссылке?
Передаются ли переменные PHP по значению или по ссылке?
Сведения об ответе
прога

18:03, 1st July, 2020
Это по стоимости согласно документации PHP .
По умолчанию аргументы функции передаются по значению (так что если значение аргумента внутри функции изменяется, то оно не изменяется вне функции). Чтобы разрешить функции изменять свои аргументы, они должны передаваться по ссылке.
Чтобы аргумент функции всегда передавался по ссылке, добавьте амперсанд ( & ) к имени аргумента в определении функции.
Сведения об ответе
VERSUION

18:03, 1st July, 2020
Похоже, что многие люди путаются в том, как объекты передаются в функции и что такое передача по ссылкам. Объектные переменные по-прежнему передаются по значению, его просто значение, которое передается в PHP5, является дескриптором ссылки. В доказательство:
Передача по ссылке означает, что мы можем изменить переменные, которые видит вызывающий объект. Чего явно не делает приведенный выше код. Нам нужно изменить функцию подкачки на:
для того, чтобы пройти по ссылке.
Сведения об ответе

18:03, 1st July, 2020
В PHP объекты по умолчанию передаются как копия ссылки на новый объект.
Смотрите этот пример.
А теперь смотри сюда.
А теперь смотри сюда .
я надеюсь, что вы можете понять это.
Сведения об ответе
qwerty101

18:03, 1st July, 2020
В PHP 5 появилась новая объектная модель. Обработка объектов PHP была полностью переписана, что позволило повысить производительность и расширить функциональные возможности. В предыдущих версиях PHP объекты обрабатывались как примитивные типы (например, целые числа и строки). Недостатком этого метода было то, что семантически весь объект копировался, когда переменная присваивалась или передавалась в качестве параметра методу. В новом подходе на объекты ссылаются по дескриптору, а не по значению (можно думать о дескрипторе как идентификаторе объекта).
Сведения об ответе
FAriza

18:03, 1st July, 2020
PHP переменные присваиваются по значению, передаются функциям по значению, а при содержании/представлении объектов передаются по ссылке. Вы можете принудительно передавать переменные по ссылке, используя &
Присваивается по значению / ссылочному примеру:
var1: испытание, var2: окончательное испытание, var3: окончательное испытание
Как передаются переменные по значению или по ссылке php
Ссылки в PHP позволяют ссылаться на область памяти, где расположено значение переменной или параметра. Для создания ссылки перед переменной указывается символ амперсанда — & . Но перед рассмотрением ссылок сначала рассмотрим простой пример копирования переменных:
Здесь переменной $sam присваивается значение переменной $tom («Tom»). Затем той же переменной $sam присваивается новое значение — «Sam». Результат программы ожидаем — обе переменные имеют различные значения:
Теперь при копировании значения переменных передадим ссылку:
Здесь нас интересует выражение
В данном случае переменной $sam передается не копия значения переменной $tom , как в предыдущем случае, а ссылка на область в памяти, которую занимает переменная $tom . То есть после выполнения инструкции
Обе переменных будут указывать на один и тот же адрес в памяти. Это приведет к тому, что изменение значения одной из этих переменных приведет к изменению значения другой переменной. Потому что они ссылаются на один и тот же участок в памяти и соответственно имеют одно общее значение:
Присвоить ссылку на переменную можно двумя способами:
Передача по ссылке
В примере в прошлых темах мы передавали параметры по значению . Но в PHP есть и другая форма передачи параметров — по ссылке . Рассмотрим два этих способа передачи параметров и сравним. Стандартная передача параметра по значению:
В данном случае внутри функции square() значение параметра $a возводится в квадрат. То есть значение параметра внутри функции изменяется. Однако после вызова функции square() значение переменной $number , которое передается параметру $a, не изменится. Это и есть передача по значению, она никак не затрагивает переменную $number .
Теперь рассмотрим передачу параметра по ссылке:
При передаче по ссылке перед параметром ставится знак амперсанда: function square(&$a) . Теперь интерпретатор будет передавать не значение переменной, а ссылку на эту переменную в памяти. То есть теперь и переменная $number и параметр $a будут указывать на одну и ту же область в памяти. В итоге, значение переменной $number после передачи параметру &$a также будет изменено.
Возвращение ссылки из функции
Функция также может возвращать ссылку. В этом случае при определении и вызове функции перед ее именем ставится знак амперсанда:
В данном случае функция checkName() получает параметр по ссылке и возвращает ссылку — фактически ссылку, которая передается в функции. Для этого перед определением функции указан символ амперсанда:
Для имитации работы функция проверяет имя пользователя и изменяет его на некоторое стандартное, если оно равно «admin».
При вызове функции перед ее именем указывается символ амерсанда:
После выполнения функции переменная $checkedName фактически будет содержать ссылку на переменную $userName .
Just another blog
Дописывая свой проект столкнулся с проблемой передачи объектов в PHP, о чем и хотел бы тут все расписать, мало ли кому пригодится.
Общеизвестно, что с 5ой версии PHP все объекты передаются по ссылке. Но что же стоит за этой фразой?
Пример первый:
Обновив страницу несколько раз, получаем:
my_int=0 my_obj.i=0 my_int=0 my_obj.i=1 my_int=0 my_obj.i=2
Т.е. объект сохраняется в сессии, даже при том что мы этого явно не делали. Тут все просто, $my_obj = $_SESSION[‘my_obj’]; создает в $my_obj копию идентификатора и обращение к $my_obj->i фактически равносильно $_SESSION[‘my_obj’]->i
Добиться того же эффекта с переменной можно явно присвоив значение по ссылке:
Теперь при обновление страницы увеличиваться будут оба счетчика.
Возьмем менее тривиальный пример, чтобы показать, менее очевидные веши:
Вывод менее очевиден, не так ли?
Под передачей по ссылке подразумевается передача копии указателя, следовательно при обращение через “->”, мы получаем доступ к внутренностям переданного объекта, тогда как “=” оперирует уже с локальной копией объекта.
Символ “&” автоматически устанавливает присваиваемой переменной идентификатор того же участка память, что и у оригинального объекта. Здесь более подходит термин “alias”. Этот алиас будет постоянным, до тех пор, пока его явно не удалить (unset($var_name)).
Вывод: в функции передаются указатели на объекты, не сами объекты. Эти указатели – копии оригиналов, до тех пор пока в параметрах функции не используется “&” – в этом случае передается оригинал.
This entry was posted on Saturday, March 26th, 2011 at 19:43 and is filed under PHP. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.