2010-02-25 141 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; 
} 

我加這個用於驗證。