Создание объекта по ссылке.

.des.

Поставил пиво кому надо ;-)
передача в функцию ($a) делает имя для локальной (1) и копию в локальной (2)
Это не верно. PHP как заметил Demiurg, в этом отношении довольно сообразителен и делает копию только при попытке записи.
 

trigger

Guest
Demiurg
.des.
Да, я это знал(когда-то такая тема была). Только что от этого изменится? Только оценки времени выполнения и занимаемой памяти. Не писал, потому что лень, и точно не знаю, когда передается по "copy on write", а когда -- нет.

-~{}~ 15.02.04 19:38:

Кстати да, оценки иногда бывают полезны:

Никто не знает, когда "copy on write", а когда -- нет?

В исходники не полезу, и не советуйте... [=
 

Screjet

Новичок
Ну само по себе внутреннее действие, что производит ПХП-машина = неважно.. Но все таки постараюсь пояснить, что когдато выяснил из исходников (инфа может быть вполне устарелой).

Обычное (не скажу точный термин :) ) создание объекта класса.
PHP:
$obj = new myClass();
В этом месте
PHP:
new myClass();
ПХП-машина создает временную переменную объекта класса myClass (условно tmp).
А здесь
PHP:
$obj =
создает копию этой временной переменной (копирует объект переменной tmp в переменную obj, тип переменной obj назначается "объект класса".
Ну и
PHP:
;
временная переменная tmp уничтожается :)

Ну и посмотрим что происходит при создании объекта класса по ссылке:
PHP:
$obj = & new myClass();
В этом месте
PHP:
new myClass();
ПХП-машина так же создает временную переменную tmp объекта класса.
А вот в этом месте
PHP:
$obj = &
создает переменную/ссылку на объект переменной tmp.
Ну и
PHP:
;
Здесь временный объект переменной tmp не уничтожается, т.к. существуют на него ссылки.

Допустим:
PHP:
unset($obj);
уничтожаем ссылку на объект в переменной tmp. Автоматически уничтожается и временный объект в перменной tmp.

Вывод:
Поведение: совершенно одинаковое.
Быстродействие: "= & new" незначительно быстрее, чем "= new"
Обращение к объекту: при "= & new" медленее
Примечание: в ПХП5 операция "= & new" выполняется так же как и "= new"

IMXO: при "=" выгоднее былоб переменную tmp переименовывать в obj :)
 
Сверху