PHP4: Проблема при возвращении ссылки на объект

Akademic

Новичок
PHP4: Проблема при возвращении ссылки на объект

Доброе время суток!

Столкнулся с проблемой. Вместо ссылки на существующий объект возвращается копия объекта.
Код, приведёный ниже выдаёт "Тест1Тест2", а надо "Тест2Тест2".

PHP:
<?php

class class4reg {

    var $test_var = '123';

}

class registrator {

    var $_objects = array();

    function regObj( &$obj ) {
        $this->_objects[get_class( $obj )] = &$obj;
    }

    function & newObj( $class_name ) {
        $obj = new $class_name();
        return $obj;
    }

    function & getObj( $class_name ) {
        if( !isset( $this->_objects[$class_name] ) ) {
            $obj = $this->newObj( $class_name );
            $this->regObj( &$obj );
        }
        else
            $obj = $this->_objects[$class_name];
        
        return $obj;
    }
}

    $reg = new registrator();

    $obj1 = $reg->getObj( 'class4reg' );

    $obj1->test_var = 'Тест1';

    $obj2 = $reg->getObj( 'class4reg' );

    $obj2->test_var = 'Тест2';

    echo $obj1->test_var;
    echo $obj2->test_var;

?>
Поможете?
 

Sokil.Dmytro

Новичок
у мну так как ты хош

PHP Version 5.2.1

тока такие вещи
$this->regObj( &$obj );
в пятифане непозволительны, достаточно возле параметра ф-ции & поставить
 

Akademic

Новичок
Поэтому я и указал, что php4.
Нет возможности использовать php5.
 

Akademic

Новичок
Спасибо. Буду ждать.
Сам часа 4 провозился и код там не такой маленький...
 

itprog

Cruftsman
угу, я ошибся у себя с версией, 5 была, а так:
PHP:
$obj1 = &$reg->getObj( 'class4reg' );
....
$obj2 = &$reg->getObj( 'class4reg' );
 

Sokil.Dmytro

Новичок
плин тока решение нашел

PHP:
    function & getObj( $class_name ) { 
        if( !isset( $this->_objects[$class_name] ) ) { 
            $obj = $this->newObj( $class_name ); 
            $this->regObj( &$obj ); 
        } 
        else 
            $obj =  [ --> ]&[ <-- ]$this->_objects[$class_name]; 
         
        return $obj; 
    }
-~{}~ 08.08.07 19:36:

Akademic
как это заработало?
 

Akademic

Новичок
Sokil.Dmytro, в каком смыле?
Это удивление или вопрос?

Вот код, который заработал в итоге:

PHP:
<?php
class class4reg {

    var $test_var = '123';

}

class registrator {

    var $_objects = array();

    function regObj( &$obj ) {
        $this->_objects[get_class( $obj )] = &$obj;
    }

    function & newObj( $class_name ) {
        $obj = new $class_name();
        return $obj;
    }

    function & getObj( $class_name ) {
        if( !isset( $this->_objects[$class_name] ) ) {
            $obj = &$this->newObj( $class_name );
            $this->regObj( &$obj );
        }
        else
            $obj = &$this->_objects[$class_name];
        
        return $obj;
    }
}

    $reg = new registrator();

    $obj1 = &$reg->getObj( 'class4reg' );

    $obj1->test_var = 'Тест1';

    $obj2 = &$reg->getObj( 'class4reg' );

    $obj2->test_var = 'Тест2';

    echo $obj1->test_var;
    echo $obj2->test_var;

?>
 

Sokil.Dmytro

Новичок
Akademic
меня удивило то что ты сказал спасибо itprog за неработающий код :)

а хохма вся в коде function & getObj( $class_name ) который поравнял уже ты сам небось :)
 

itprog

Cruftsman
Sokil.Dmytro
за неработающий код
хмхм, у меня код получился работающий, просто когда отвечал не заметил что еще одну строку поменял в коде, но видимо автор сам догадался про нее...
одного $obj = [ --> ]&[ <-- ]$this->_objects[$class_name]; недостаточно, так что твое + мое = решение :)
 

Akademic

Новичок
itprog, мне в другом месте подсказали.
А вообще, удручает необходимость везде где лезет ставить &.
Казалось бы метод объявлен как возвращающий ссылку, ан нет...
Ну это я так, ворчу после тяжёлого дня. Вот будет у нас переход на PHP5 ещё наплачемся.

Благодаря топику осознал, что у меня в коде сплошные копирования объектов, где надо и где не надо.
Ещё раз, спасибо. А то уже на принцип с этим багом шёл.
Два года он висел, была найдена куча методов его обойти, а расправится так не было времени.
Я - третий человек, которому он достался в наследство =).
Но сегодня великий день! :)
 

Sokil.Dmytro

Новичок
можно постараться написать такую обертку которая скрывала бы ссылки, тогда их один раз отладишь и забиваешь. Пусть они будут внутри какого нибуть класса,а для работы видны только интерфейсные ф-ции без возможности править обьект. Вот и не будет у тебя в коде ссылок

itprog, :)
 

cDLEON

Онанист РНРСlub
Ты два раза продублировал &
Если ты в функцию объявляешь так:
PHP:
function regObj(&$obj)
 {
 #asdasd
 }
То и вставлять объект туда надо так:
$hren->regObj($obj);
а не
$href->regObj(&$obj);
 

Sokil.Dmytro

Новичок
cDLEON
это в пятерке уже не надо, а четыре такой код хавала
смотри мой первый пост :)
 
Сверху