Клонировать объект в $this

Я хотел бы спросить о клонировании/копировании объекта PHP в переменную $this.

В настоящее время я новичок в MVC, я хотел бы сделать что-то вроде CodeIgniter.

Я хотел бы получить прямой доступ к переменной.

в моем __construct() я всегда передаю глобальную переменную внутри новому контроллеру (классу),

eg.

function __construct($mvc)
{
    $this->mvc = $mvc;
}

внутри $mvc есть объект конфигурации, объект vars.

например, в настоящее время

function index()
{
    $this->mvc->config['title'];
    $this->mvc->vars['name'];
}

** то, что я хочу, более прямое **

function index()
{
    $this->config['title'];
    $this->vars['name'];
}

я пытался

function __construct($mvc)
{
    $this = $mvc;
}

or

function __construct($mvc)
{
    $this = clone $mvc;
}

это не удачно. есть идеи, я могу закрыть $this->mvc до уровня $this? Я пытаюсь foreach также безуспешно. Пожалуйста, помогите, Спасибо!


person Shiro    schedule 25.02.2010    source источник


Ответы (3)


Элегантным решением было бы переопределить __get():

public function __get($name) {
    return $this->mvc->$name;
}

__get() вызывается всякий раз, когда вы пытаетесь получить доступ к несуществующему свойству вашего класса. Таким образом, вам не нужно копировать каждое свойство mvc внутри вашего класса (что может переопределить свойства в вашем классе). При необходимости вы также можете проверить, существует ли $name в mvc, с помощью property_exists.

person Felix Kling    schedule 25.02.2010
comment
Вау, спасибо! отлично! Спасибо за помощь Галену и Феликсу. Я действительно многому учусь :) - person Shiro; 25.02.2010

Похоже, это то, что вы пытаетесь сделать...

function __construct($mvc)
{
    foreach($mvc as $k => $v) {

        $this->$k = $v;

    }

}
person Galen    schedule 25.02.2010
comment
эээ... это действительно странно, только сейчас я тоже пытаюсь таким образом, безуспешно, но я пытаюсь еще раз. Это работает! Не знаю, что случилось..@@ - person Shiro; 25.02.2010

public function __get($name) 
{
    if (array_key_exists($name, $this->mvc)) 
    {
       return $this->mvc->$name;
    }

    $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);
        return NULL;
}

Я добавил это для проверки.

person Shiro    schedule 25.02.2010