2010-02-25 146 views
3

我想问一下PHP clone/copy对象到$ this变量。

目前我是新的MVC,我想做一些像CodeIgniter。

我想直接访问该变量。

在我__construct(),我总是传递全局变量里面有新的控制器(类),

如。

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

$ mvc里面有配置对象,vars对象。

e.g,目前

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到$这个级别? 我尝试foreach也没有成功。请帮忙,谢谢!

回答

7

优雅的解决办法是重写__get()

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

__get()被调用,只要你尝试访问你的班级不存在的财产。这样,您不必在课堂内复制mvc的所有属性(可能会覆盖您班级中的属性)。如有必要,您还可以使用property_exists检查$name是否存在于mvc中。

+0

+1:是的,这将是更好的和通用的解决方案 – Sarfraz 2010-02-25 07:14:45

+0

哇..谢谢!这很棒!为Galen和Felix提供帮助。我真的学到了很多:) – Shiro 2010-02-25 07:36:11

+0

真棒,我总是学到新东西;) – casraf 2010-02-25 09:11:31

1

它看起来这是你想要做什么......

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

     $this->$k = $v; 

    } 

} 
+0

呃......真的很奇怪,刚才我也试过这种方式没有成功,但我再试一次。这行得通!。不知道发生了什么.. @@ – Shiro 2010-02-25 07:14:58

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

我加这个用于验证。