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

Бих искал да попитам за PHP клонинг / копиране на обект в $this променлива.

В момента съм нов в MVC, бих искал да направя нещо като CodeIgniter.

Бих искал да осъществя директен достъп до променливата.

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

eg.

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

вътре в $mvc got config обект, 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