Какой смысл писать: $ foo = & new someClass () ;? - PullRequest
1 голос
/ 30 мая 2011

Я получаю устаревшее предупреждение из-за используемой библиотеки. Заявление следующее:

$this->_ole =& new OLERead();

Дело в том, что я не понимаю, почему кто-то хотел бы использовать & new в экземпляре.

Если я не ошибаюсь, оператор & говорит PHP скопировать ссылку на экземпляр, а не сам экземпляр. Но в таком случае, не бессмысленно ли запрашивать копию ссылки, которая не сохраняется?

Но поскольку я точно не знаю, как именно работает new, возможно, это должно было спасти какую-то неясную сборку мусора или что-то в этом роде.

Что вы думаете об этом?

Ответы [ 4 ]

4 голосов
/ 30 мая 2011

Из документации :

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

Используемая вами библиотека, вероятно, была разработана для PHP 4.

Полезную информацию о , почему это использовалось, также можно найти в руководстве по миграции :

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

1 голос
/ 30 мая 2011

В PHP4 new возвращает значение, а не ссылку.

Это не так в PHP5.

1 голос
/ 30 мая 2011

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

0 голосов
/ 30 мая 2011

Если вы напишите $this->_old =& new OLERead();, изменение _ole в любом объекте обновит все ссылки на новый объект.

Это не так без &.

РЕДАКТИРОВАТЬ: И да, в предыдущих версиях PHP объект передавался путем копирования. В конце концов, довольно сложно иметь согласованное поведение в разных версиях.

...