PHP ООП - вернулись неправильные переменные? - PullRequest
0 голосов
/ 09 мая 2011

Итак, с кодом ниже:

class Core {
    public $child;
    public function start() {
        $child = Loader::instance('Child');
        print_r($this);
    }
}

class Loader extends Core {
    public static $instances;

    public static function instance($class) {
        if(!isset(self::$instances[$class])) {
            self::$instances[$class] = new $class();
        }

        return self::$instances[$class];
    }
}

class Child extends Core {
    public function __construct() {
        parent::__construct();

        $this->child = 'test';
    }
}

Loader::instance('Core')->start();

Я должен быть в состоянии после print_r ($ this) увидеть:

Core Object
(
    [child] => test
)

вместо

Core Object
(
    [child] => 
)

что происходит сейчас?

Еще раз спасибо ..

Ответы [ 3 ]

2 голосов
/ 09 мая 2011

В методе start() класса Core вы используете переменную $child, которая не является свойством объекта.Вместо этого напишите:

class Core {
    public $child;
    public function start() {
        $this->child = Loader::instance('Child')->child;
        print_r($this);
    }
}

и скажите мне, хотите ли вы этого достичь.

РЕДАКТИРОВАТЬ:

Я считаю, что вы можете достичьчто вы хотите, ссылаясь на статические переменные.Но будьте осторожны, как они работают.Более того, вы не увидите результат, вызвав print_r().

Вот код:

class Core {
    static $child;
    public function start() {

        // invoking code that changes Core::$child inside
        $child = Loader::instance('Child');

        print_r($this);
    }
}

и

class Child extends Core {
    public function __construct() {
        parent::__construct();

        // changing static variable $child of both Core and Child
        self::$child = 'test';
    }
}
0 голосов
/ 09 мая 2011

Отсюда вывод ваших print_r:

    $child = Loader::instance('Child');
    print_r($this);

И он напечатает текущий объект ($this - это Core), а не новый экземпляр $ child (который будет Child классом).

0 голосов
/ 09 мая 2011
$child = Loader::instance('Child');

Должно быть:

$this->child = Loader::instance('Child');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...