Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > [Class & Objects] композиция и ссылки


Автор: BrutalizedProgrammer 19.1.2007, 18:56
собсна вот такой код на PHP4 (нужно передать объект по ссылке)
Код

class SomeClass {
    var $code = 0;
    function SomeMethod() {
        $this->code++;
    }
}
class MyClass {
    var $class;
    function MyClass($class) {
        $this->class = $class;
    }
}
$SomeClass = new SomeClass();
$MyClass = new MyClass(&$SomeClass);
$SomeClass->SomeMethod();
echo('$SomeClass->code = '.$SomeClass->code.'<br>');
echo('$MyClass->class->code = '.$MyClass->class->code.'<br>');

объект не передается по ссылке...
и так тоже не передается:
Код

...class MyClass {
    var $class;
    function MyClass(&$class) {
        $this->class = $class;
    }
}...

и даже если втыкнуть в обоих местах амперсанды, все равно не передается,
а просто копируется.
вроде все правильно написал и протестил,
дайте пожалуйста толковый совет.

Автор: GZep 19.1.2007, 19:59
А в PHP вроде переменные не могут содержать сами объекты, а могут только ссылки на них...

А зачем:
Код

$MyClass = new MyClass(&$SomeClass);

тут как раз & не нужен...

Автор: BrutalizedProgrammer 19.1.2007, 20:04
кароче мне нужно, чтоб я работал с одним и тем же объектом 
в разных местах, а не с его копиями....
ну лан... меня все это напрягло...
нашел хостинг с PHP5, к черту 4 версию... мозги с ней поломать можна...

Автор: -=Ustas=- 20.1.2007, 12:14
Цитата(GZep @  19.1.2007,  19:59 Найти цитируемый пост)
А в PHP вроде переменные не могут содержать сами объекты, а могут только ссылки на них...

Это только в пятом.
BrutalizedProgrammer, либо так
Код

class SomeClass {
    var $code = 0;
    function SomeMethod() {
        $this->code++;
    }
}
class MyClass {
    var $class;
    function MyClass(&$class) {
        $this->class = $class;
    }
}
$SomeClass = new SomeClass();
$MyClass = new MyClass($SomeClass);

Либо можешь так
Код

class SomeClass {
    var $code = 0;
    function SomeMethod() {
        $this->code++;
    }
}
class MyClass {
    var $class;
    function MyClass() {
        $this->class =& new SomeClass();
    }
}
$SomeClass = new SomeClass();
$MyClass = new MyClass();


или 
Код

class SomeClass {
    var $code = 0;
    function SomeMethod() {
        $this->code++;
    }
}
class MyClass {
    var $class;
    function MyClass() {
        
    }
}
$SomeClass = new SomeClass();
$MyClass = new MyClass();
$MyClass->class =& $SomeClass;

Но лучше конечно же на 5-ый перебираться

Автор: AztEK 20.1.2007, 16:44
Цитата
Цитата
А в PHP вроде переменные не могут содержать сами объекты, а могут только ссылки на них...

Это только в пятом.

Не совсем так... В PHP4 и раньше значения всех типов сохранялись в специальной структуру zval Zend\'овского движка. Они могли хранить как простые значения (строки и числа), так и сложные (массивы и объекты).
Из-за этого и возникала проблема WTMA (Way Too Many Ampersands), когда для простейшего ООП-приложения надо было юзать чудовищное количество ссылок. С точки зрения программирования на PHP4 здесь все верно - как копируются строки, так должны и объекты (они одного типа по сути). Но опыт проектирования ООП-структур этому противоречил и в PHP5 ввели другую систему. Все переменные кроме объектов по прежнему хранятся в zval, а объекты хранятся в другом месте, так называемом Object Store и представляют собой, по сути, дескриптор (а не ссылку!) на структуру данных в этом хранилище. Т.е. теперь при присваивании обэекта он не копировался, а возвращался по ссылке как того и надо.

Автор: Vaulter 20.1.2007, 17:37
в PHP6 передача обьекта по ссылке будет считатся за ошибку => 
код все равно придется переделывать smile

Автор: GZep 20.1.2007, 22:05
Цитата(AztEK @  20.1.2007,  16:44 Найти цитируемый пост)
Object Store и представляют собой, по сути, дескриптор (а не ссылку!) на структуру данных в этом хранилище

Ого... Как все запущено... Спасибо, это очень полезная инфа!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)