Отложенное копирование в PHP

Сергей Тарасов

Профессор
Отложенное копирование в PHP

Всем привет!

Возник такой вопрос: а на основании чего процессор Zend решает изменился ли объект или нет?

PHP:
$a = new foo();
$b = $a;
На текущий момент это один и тот же объект с ref_count =2.
Теперь:

PHP:
$a->bar();

bar объявлен как

PHP_ME(foo, bar, NULL, ZEND_ACC_PUBLIC)


Он, в принципе, меняет внутренние данные объекта. Вот как сообщить об этом ZEND ?
Чтобы после этого он вызывал __clone ?
 

crocodile2u

http://vbolshov.org.ru
Что-то непонятно, чего ты хочешь. Чтобы после вызова $a->bar(); - $b и $a перестали быть одним и тем же объектом? Если так, то, имхо, ты не должен этого хотеть.
 

Сергей Тарасов

Профессор
Автор оригинала: crocodile2u
Чтобы после вызова $a->bar(); - $b и $a перестали быть одним и тем же объектом?
Именно. Грубо говоря метод bar() - неконстантный.

Автор оригинала: crocodile2u
Если так, то, имхо, ты не должен этого хотеть.
Почему? :)
 

Alexandre

PHPПенсионер
Он, в принципе, меняет внутренние данные объекта. Вот как сообщить об этом ZEND ?
т.е. ты хочешь, чтоб по какому-то внутреннему признаку он вызывал __clone()
напиши свой вариант __clone() и вызывай его из bar ( PHP_ME(foo, bar, NULL, ZEND_ACC_PUBLIC) ) по своему алгоритму
Чтобы после вызова $a->bar(); - $b и $a перестали быть одним и тем же объектом? Если так, то, имхо, ты не должен этого хотеть.
Почему?
идеалогтчески объекты в php передаются ссылками
если хочешь клпировать объект - то используй clone()
 

crocodile2u

http://vbolshov.org.ru
Хотя бы потому, что это сделало бы твое приложение ОЧЕНЬ непрозрачным для пользователя. Я бы просто не стал использовать библиотеку, в описании которой увидел бы что-то вроде "после вызова bar() ссылки перестают быть ссылками".

А если у тебя будет 3 таких переменных - ссылки на один объект? Что тогда делать после bar()? все эти переменные должны будут стать разными объектами? Или та, для которой вызвали bar() - должна "отпочковаться" от остальных?

Короче, такая "фича" больше походила бы на багу.
 

Сергей Тарасов

Профессор
Хотя, видимо PHP тут сам не силен:

PHP:
<?php

class foo
{
	public $internal = 5;
	public function bar()
	{
		$this->internal = 100;
	}
}

$a = new foo();
$b = $a;

var_dump($a);
echo "\n";
var_dump($b);

$a->bar();

var_dump($a);
echo "\n";
var_dump($b);

?>
Выдает:


X-Powered-By: PHP/5.2.5
Content-type: text/html

object(foo)#1 (1) {
["internal"]=>
int(5)
}

object(foo)#1 (1) {
["internal"]=>
int(5)
}
object(foo)#1 (1) {
["internal"]=>
int(100)
}

object(foo)#1 (1) {
["internal"]=>
int(100)
}
 

crocodile2u

http://vbolshov.org.ru
Сергей Тарасов
Хотя, видимо PHP тут сам не силен
Есть мнение, что кто-то просто не очень силен в PHP...

Это ожидаемое поведение. Такое поведение разработчику нужно в 999 случаях из 1000.

Если нужно копировать - $b = clone $a;
 

zerkms

TDD infected
Команда форума
Сергей Тарасов
хватит тупить.
факт: объекты всегда передаются по ссылке. это особенность php5. не нравится - юзай 4 версию или другой ЯП.
 

Сергей Тарасов

Профессор
Автор оригинала: crocodile2u
Сергей Тарасов

Есть мнение, что кто-то просто не очень силен в PHP...
Честно говоря не ожидал, что заявленное отложенное копирование таковым по сути не является :(((

Автор оригинала: crocodile2u
Сергей Тарасов
Это ожидаемое поведение. Такое поведение разработчику нужно в 999 случаях из 1000.
Вот тут ты не прав. Такое поведение, как минимум, не логично.



Автор оригинала: crocodile2u
Сергей Тарасов
Если нужно копировать - $b = clone $a;
Спасибо, об этом я как-то сам догадался :)))

-~{}~ 26.06.08 14:25:

zerkms

ОК! :)
 
Сверху