2010-02-25 6 views
3

Je voudrais demander à propos de PHP clone/copier l'objet à $ cette variable.

Actuellement, je suis nouveau dans MVC, je voudrais faire quelque chose comme CodeIgniter.

Je voudrais diriger l'accès à la variable.

dans mon __construct(), je passe toujours la variable globale à l'intérieur du nouveau contrôleur (classe),

par exemple.

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

à l'intérieur de l'objet $ mvc got config, objet vars.

par exemple, actuellement

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

** ce que je veux est plus direct **

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

j'avais essayer

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

ou

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

pas avec succès. une idée, je peux fermer $ this-> mvc à $ ce niveau? J'essaye aussi de ne pas réussir. S'il vous plaît, aidez, merci!

Répondre

7

Une solution élégante serait de passer outre __get():

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

__get() est appelé à chaque fois que vous essayez d'accès une propriété inexistante de votre classe. De cette façon, vous n'avez pas besoin de copier chaque propriété de mvc dans votre classe (ce qui pourrait remplacer les propriétés de votre classe). Si nécessaire, vous pouvez également vérifier si $name existe dans mvc avec property_exists.

+0

+1: oui ce sera mieux et solution générique – Sarfraz

+0

wow .. merci! c'est bien! Merci pour Galen et Felix. J'apprends vraiment beaucoup :) – Shiro

+0

Génial, j'apprends toujours quelque chose de nouveau;) – casraf

1

On dirait que c'est ce que vous essayez de faire ...

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

     $this->$k = $v; 

    } 

} 
+0

euh ... c'est vraiment bizarre, tout à l'heure j'essaie aussi de cette façon sans succès, mais j'essaye à nouveau. Ça marche!. Je ne sais pas ce qui se passe .. @@ – 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; 
} 

J'ai ajouté ceci pour validation.