2017-02-02 9 views
2

вопрос для тех, кто знает. PHP documentation (для php5) четко заявляет, что вы не передаете объекты по ссылкам в php, потому что для метода, который принимает объект, фактически переданное значение является «идентификатором объекта, который позволяет объектным аксессуарам находить фактический объект», , Вопрос в том, что происходит, когда вы на самом деле do сделать это?Что происходит, когда вы передаете объект по ссылке, в php, под капотом?

Рассмотрим следующий код:

<?php 
function foo(&$arg){ 
    if(is_array($arg)){ 
     print $arg['foo']; 
    } 
    if(is_object($arg)){ 
     print $arg->{'foo'}; 
    } 
} 
$o1 = new \stdClass; 
$o1->foo = 'bar'; 
$a1 = ['foo'=>'bar']; 
print sprintf("O1 foo: %s", foo($o1)); 
print sprintf("a1 foo: %s", foo($a1)); 

Это правильно выводит:

o1 foo: bar 
a1 foo: bar 

Возникает вопрос: почему? Может ли кто-нибудь описать, что происходит с этой ссылкой идентификатора объекта, которая все еще позволяет получить доступ к фактическому объекту?

+0

'why'. И почему бы нет? –

ответ

3

Любая переменная, содержащая объект, не удерживает объект напрямую. Он содержит идентификатор объекта. Представьте, что это объект, живущий где-то в пуле объектов, с прикрепленным к нему числом, например. # 5. Вся переменная содержит «объект # 5». PHP знает, что переменная относится к объекту и что он должен быть объектом # 5.

Всякий раз, когда вы работаете с такой переменной, содержащей ссылку на объект, PHP просматривает ссылочный объект из пула объектов.

Когда вы передаете такую ​​переменную в функцию, PHP делает копию этой ссылки. Есть тогда две переменные, содержащие содержимое «объект # 5». Не сам экземпляр объекта был скопирован, просто эта крошечная заметка, которая гласит «объект № 5».

Когда вы передаете такую ​​переменную в функцию по ссылке, ну, вы передаете эту записку «объект # 5» по ссылке. PHP не будет копировать его. Но это все еще просто переменная, говорящая «object # 5», поэтому, когда вы пытаетесь с ней работать, PHP будет искать объект из пула.

Этот механизм ссылки объекта не совпадает с механизмом передачи по ссылке &. Механизм ссылки объекта работает точно так же, как и все другие операции с переходом; это просто, что значение, которое представляет ссылку на объект, всегда обрабатывается определенным образом (PHP должен искать реальный объект в другом месте).

+0

Спасибо за это. Очень тщательно ответил на мой вопрос. – Aron

+0

Последующие действия: я бы предположил из вышеизложенного, что, хотя неверно передавать объекты по ссылке в методы/функции, на самом деле это не повредит. Скажете ли вы, что это утверждение верно? – Aron

+0

Это не больно * как таковое. Однако, поскольку теперь вы держите ссылку на переменную в вызывающем **, и вы можете манипулировать ее значением **, проще вводить ошибки, изменяя переменную, ожидать. – deceze

 Смежные вопросы

  • Нет связанных вопросов^_^