![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| Bikutoru |
|
||||||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: нет Всего: 22 |
Здраствуйте, у меня возник один немного философский вопрос.
Но прежде, чем я его задам, нужно привести некоторые рассуждения. Очень часто в совершенно разных местах я видел код вроде
Я знаю, что & это операция взятия указателя на объект, я знаю, что new SomeClass - это операция создания представителя класса. Таким образом, получается что эти две операции означают присваивание переменной $someObj указателя на вновь созданный экземпляр класса SomeClass. Указатель на объект может потребоваться в двух случаях: 1. передача объекта в метод, где он может быть изменен; 2. наличие нескольких "псевдонимов" для одного и того же объекта (т.е. нескольких переменных, указывающих на одну и ту же область памяти). Я набросал следующий тест:
Как видно из этого теста (я тестировал в PHP 4.3.8), результаты для $obj1 и $obj2 одинаковы. А отсюда следует вывод, что &new - абсолютно бесполезная операция, вместо которой следует использовать
Наконец-то я добрался до своего вопроса: Так зачем нужно &new, какой в нем прок? -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
||||||
|
|||||||
| mr.fox |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 298 Регистрация: 13.3.2005 Где: Ирландия Репутация: нет Всего: 2 |
насколько я знаю, это создает ссылку на сласс. при изменении класса, перменная тоже меняеться..
|
|||
|
||||
| Joes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 15.11.2004 Репутация: нет Всего: 7 |
В PHP, когда ты изменяешь значения переменных, действия производятся над их копиями. Значит когда ты не передаёшь объект по ссылке при изменении его или его свойств, происходит его копирование в новый объект. Короче говоря, не юзая &, создастся 2 объекта...
В то время, как в PHP5 все объекты, по-моему, изначально являются ссылками. Но это уже другая сказка :-) Добавлено @ 20:38 точнее 2 копии объекта... че-то я сглючил... |
|||
|
||||
| Illuminaty |
|
|||
![]() /*Антон Захаров*/ ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1238 Регистрация: 19.3.2005 Где: Россия, Казань Репутация: 1 Всего: 56 |
Bikutoru, посмотри в мануале, в разделе Ссылки с глобальными и статическими переменными
Это сообщение отредактировал(а) Illuminaty - 7.1.2006, 20:56 |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
new нужна полюбому для создания объекта.
& надо, чтобы в переменной $a = & new MyC() был указательно место в памяти, занимаемое объектом. При этом не будет создаваться еще одна копия объекта. |
|||
|
||||
| Bikutoru |
|
||||||||||||||||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: нет Всего: 22 |
Может быть ссылку на объект класса?
Согласен. При присваивании объектов и передаче объектов в виде параметра в метод объекты клонируются и чтобы этого избежать нужно использовать &. Но речь-то немного о другом. Посмотри, пожалуйста, пример. Объекты
ведут себя одинаково (клонируются) и получается, что прока от & перед new никакого!
Согласен, но речь идет о PHP4 :-(
Похожие цитаты, не правда ли :-) Mal Hack, запусти, пожалуйста, пример и посмотри его вывод.
Эти объекты ведут себя совершенно одинаково, они клонируются, а не передаются по ссылке при присваивании и при передаче в качестве параметра. Illuminaty, замечательная ссылка. Это:
и последующий пример всё объясняют. Большое тебе человеческое спасибо. Это сообщение отредактировал(а) Bikutoru - 8.1.2006, 11:46 -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
||||||||||||||||
|
|||||||||||||||||
| Mal Hack |
|
||||||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
У тебя не будет создаваться еще одна копия объекта ! Добавлено @ 11:57
Тут они у тебя создаются. Клинирование объектов, это когда $obj1 =$obj2; Вот пример:
Это сообщение отредактировал(а) Mal Hack - 8.1.2006, 11:56 |
||||||||
|
|||||||||
| Bikutoru |
|
||||||||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: нет Всего: 22 |
Mal Hack, если я тебя правильно понял, то ты предыдущим постом хотел сказать, что при
присутствует операция клонирования вновь созданного объекта при присваивании его переменной, а при
нет???
Ну не надо придираться к мелочам, я привёл именно этот фрагмент, чтобы показать, какие именно объекты имеются в виду. Я же написал
:-) -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
||||||||
|
|||||||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Bikutoru когда мы пишем
Мы создаем два независимых объекта. НО при этом в памяти объект два будет храниться в единственном экземпляре. Я мог выше несколько не корретно выразить касательно указателей... Клонирование это копирование, т.е. $obj1 = $obj2. Вот если мы тут пишем &, то клонирования не будет, а $obj2 будет синонимом $obj1, по сути она получает указатель на область памяти первого объекта. Если не будем писать &, то тогда будет создан новый объект (выделена под него новый объем памяти) и это уже будет $obj2, не зависимый от 1. |
|||
|
||||
| Bikutoru |
|
|||
|
Увлекающийся ![]() ![]() Профиль Группа: Участник Сообщений: 522 Регистрация: 24.5.2005 Где: Москва Репутация: нет Всего: 22 |
Это я и имел в виду в своем предыдущем посте. Похоже мы пришли к общему знаменателю. Я все понял (пока так кажется), вопрос закрыт... Добавлено @ 15:27 P.S. А что это тема в "Профессиональное программирование" переехала, мне казалось, что сий вопрос будет полезен новичкам. -------------------- Человек, словно в зеркале мир — многолик, Он ничтожен — и он же безмерно велик! Омар Хайям |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Для профи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |