вопрос по ООП

berkut

Новичок
grigori
PHP:
$a =array('a'=>1);
$ref=&$a['a'];
$b=$a;
$b['a']=2;
echo $a['a'];
объясните пожалуйста кто-нибудь, почему оно так работает?
 

Leon82

Новичок
Автор оригинала: berkut
grigori
PHP:
$a =array('a'=>1);
$ref=&$a['a'];
$b=$a;
$b['a']=2;
echo $a['a'];
объясните пожалуйста кто-нибудь, почему оно так работает?
Програмирую на Java, сейчас необходимо будет пописать на PHP - несколько удивляет этот код. По сути же $ref должно стать ссылкой на переменную, но почему это влияет на дальнейшую работу с массивом? Присоединяюсь к вопросу...
 

HraKK

Мудак
Команда форума
Учите мат часть.
Чем по вашему такой код
PHP:
$a =array('a'=>1); 
$ref=&$a['a']; 
$b=$a; 
$b['a']=2; 
echo $a['a'];
Отличается от такого
PHP:
$a =array('a'=>1); 
$b=$a; 
$b['a']=2; 
echo $a['a'];
А ничем! Даже лучше меньше строк, и памяти жрет. Ссылку где вы тут увидели?
 

HraKK

Мудак
Команда форума
Фанат
Точно, профтыкал на ноуте работаю, тут пхп нету.
Верно что-то я забыл что если к значению массива есть указатель о преобразовывается в ref тип.
 

Андрейка

Senior pomidor developer
что если к значению массива есть указатель о преобразовывается в ref тип
кто преобразовывается в ref тип? это вы где такое вычитали?
 

Андрейка

Senior pomidor developer
ПРЕВЕД
такие вещи надо курить в мануале.. в худшем случае - где нибудь на просторах php.net (ЗЫ. эт не значит, что по ссылке написана фикня)
 

ПРЕВЕД

Новичок
Андрейка
согласен. в той статье есть небольшое описание внутренних механизмов работы. мне было проще понять сслыки через то, как работает ze.
 

HraKK

Мудак
Команда форума
Андрейка
Не преобразовывается, я не так высказался.
 

Андрейка

Senior pomidor developer
HraKK
дык выскажись как надо)... а то мы тут уже сутки гадаем что ж происходит
 

Leon82

Новичок
Что-то на форуме каждый второй "гуру" в пхп, а объяснить по-человечески не в состоянии :(
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: Leon82
Что-то на форуме каждый второй "гуру" в пхп, а объяснить по-человечески не в состоянии :(
1. на календарь глянь ;)
2. rtfm уже упомянули
3. это уже не столько PHP, сколько основы вычислительной техники как таковой
объяснять, что в любом языке программирования переменная является "ссылкой" на данные никто не хочет ...
(вопрос "почему" является оффтопом)
работа с переменными в PHP реализована _так_ (думаю, потому, что так это работает быстрее)

-~{}~ 31.12.06 00:30:

PHP:
$ref=&$a['a']
значит, что при изменении $a['a'] изменится $ref, т.е. $a['a'] является ссылкой на $ref (rtfm?)
PHP:
$b=$a['a']
значит, что все элементы $a копируются в $b, а ссылки остаются ссылками (rtfm?)
PHP:
$b['a']=2
изменяет данные, на которые указывает элемент 'a'
никаких указаний на то, что $b['a'] должен содержать что-то другое, чем $a['a'] НЕ БЫЛО, по этому $b['a'] содержит ссылку

неужели не очевидно?
 

Franzusow

Новичок
некто не спорит что $person->name быстрей работает чем $person->getname()
и возможно в простем и маленьком проекте даже имеет смысл.
В болшом проэкте лутше исползоват Методы.
пример:
завтра нужно чтобы $person->name все большими буквами выдовал, а $person->name разбросоно по многим фейлам которые все надо искать и менять.
если мы в етом случае использовали бы методу, то нам бы хватило маленкого изменения толко в классе персон и в методе гетнаме().

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

zerkms

TDD infected
Команда форума
$ref=&$a['a']

значит, что при изменении $a['a'] изменится $ref, т.е. $a['a'] является ссылкой на $ref (rtfm?)
со второй частью фразы абсолютно не согласен
из $ref=&$a['a'] следует что и $a['a'] и $ref ссылаются на одну область памяти, но никак не "т.е. $a['a'] является ссылкой на $ref"
$b=$a

значит, что все элементы $a копируются в $b, а ссылки остаются ссылками (rtfm?)
из этой строки должно следовать, что $b является ссылкой на $a (точнее - на ту же область памяти) до тех пор, пока одна из переменных не изменится и произойдёт отложенное копирование
$b['a']=2
изменяет данные, на которые указывает элемент 'a'
нет, в этом случае как раз должно произойти отложенное копирование содержимого $b['a'] в отдельную область памяти и данные должны модифицироваться
никаких указаний на то, что $b['a'] должен содержать что-то другое, чем $a['a'] НЕ БЫЛО, по этому $b['a'] содержит ссылку

неужели не очевидно?
нет не очевидно. было указание сделать ссылку $ref на элемент массива а['a'], но никак не массив b.
вы очень много ссылались на мануал. покажете конкретные ссылки?
 

itprog

Cruftsman
$ref=&$a['a'] следует что и $a['a'] и $ref ссылаются на одну область памяти
Именно, получается только что $a['a'] будет содержать ссылку на эту самую ссылку для $a['a'] и $ref. Сделано это для производительности(?)
+ из мануала:
Note: If array with references is copied, its values are not dereferenced.
 

Leon82

Новичок
grigori
Что такое ссылки мне объяснять не надо, спасибо! ) И логика работы со ссылками что в С/С++ что в Java мне абсолютно ясна...
А вот с логикой работы ссылок в ПХП, боюсь, ты сам запутался, так как вышеприведенный скрипт работает отнюдь не по описанному тобой алгоритму.

itprog, zerkms я правильно понимаю, что после $ref=&$a['a'], $a['a'] - становится ссылкой, а до проведения сей волшебной операции хранит само значение?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Автор оригинала: zerkms
со второй частью фразы абсолютно не согласен
из $ref=&$a['a'] следует что и $a['a'] и $ref ссылаются на одну область памяти, но никак не "т.е. $a['a'] является ссылкой на $ref"
Как сказать ... я не хочу спорить о значении терминов. Если смотреть изнутри (т.е. с точки зрения реализации на С), то $a['a'] и $ref ссылаются на одну область памяти.
Если с точки зрения работы скрипта - то $a['a'] и $ref становятся идентичными и ведут себя как ссылки (что и видно из примера).

из этой строки должно следовать, что $b является ссылкой на $a (точнее - на ту же область памяти)
Должно по каким правилам? Или Вы лично ожидаете этого по аналогии с практикой на _других_ языках?

должно произойти отложенное копирование содержимого $b['a'] в отдельную область памяти и данные должны модифицироваться
Что значит "отложенное"?

нет не очевидно.
RTFM
вы очень много ссылались на мануал. покажете конкретные ссылки?
Chapter 12. References Explained

References in PHP are a means to access the same variable content by different names.
They are not like C pointers; instead, they are symbol table aliases.
The most close analogy is with Unix filenames and files - variable names are directory entries, while variable contents is the file itself. References can be thought of as hardlinking in Unix filesystem.

Вы знакомы с файловой системой Unix? При записи в файл по ссылке тоже должно происходить "отложенное копирование"?
При копировании каталогов копируется содержимое, но
"If array with references is copied, its values are not dereferenced" указано вполне однозначно.

"What References Do"
$a and $b are completely equal here, that's not $a is pointing to $b

"What References Are Not"
references aren't pointers

-~{}~ 03.01.07 02:38:

Автор оригинала: Leon82
grigori
Что такое ссылки мне объяснять не надо, спасибо! ) И логика работы со ссылками что в С/С++ что в Java мне абсолютно ясна...
Welcome to PHP :)

-~{}~ 03.01.07 03:25:

Автор оригинала: Franzusow
В болшом проэкте лутше исползоват Методы.
пример:
завтра нужно чтобы $person->name все большими буквами выдовал, а $person->name разбросоно по многим фейлам
В болшом проэкте лутше использоват профессианальный оналитык,
который спрогнозирует развитие системы и спроектирует классы.
Поэтому публичные поля, такие как $person->id, не будут изменяться бизнес-логикой, другого пользователя будет представлять другой объект, а изменение регистра имени будет производиться функцией strtoupper перед выводом или сохраняться в поле $person->name_upcase.
 
Сверху