2010-02-25 1 views
3

Я хотел бы спросить о PHP clone/copy object переменной $ this.

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

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

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

например.

function __construct($mvc) 
{ 
    $this->mvc = $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; 
} 

или

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

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

ответ

7

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

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

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

+0

+1: да, это будет лучшее и общее решение – Sarfraz

+0

wow .. спасибо! отлично! Thx для Галена и Феликса поможет. Я действительно многому научился :) – Shiro

+0

Удивительный, я всегда узнаю что-то новое;) – casraf

1

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

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

     $this->$k = $v; 

    } 

} 
+0

er ... это действительно странно, только сейчас я также стараюсь, чтобы этот путь не удался, но я попробую еще раз. Это работает !. Не уверен, что произойдет. @@ – Shiro

1
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; 
} 

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