2010-03-28 9 views
1

j'ai une classe de ce genreClasses PHP: méthode d'appel en instance d'une classe par le nom de l'instance

Class Car { 
private $color; 

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

public function get_color(){ 
return $this->$color; 
} 

} 

Puis-je créer certains cas de celui-ci:

$blue_car = new car('blue'); 

$green_car = new car('green'); 

etc. 

Maintenant je dois appeler méthode get_color() à la volée, selon le nom de l'instance

$instance_name='green_car'; 

Y at-il un moyen de le faire?

+0

Bien sûr, sinon évidente (et lente) à travers eval(); –

Répondre

5
$$instance_name->get_color(); 
${$instance_name}->get_color(); 

ou quelque chose de similaire.

Edit:

Testé ...

<?php 
class test_class{ 
    public function __construct($value){ 
     $this->value = $value;  
    } 
    public function getValue(){ 
     return $this->value; 
    } 
} 

$test = new test_class("test"); 
$test2 = new test_class("test2"); 

$iname = "test"; 
$iname2 = "test2"; 

echo $$iname->getValue(), "\r\n"; \\ echos test 
echo ${$iname2}->getValue(), "\r\n"; \\ echos test2 

?> 

deux vaut en php 5.2

+0

Merci, c'est ce dont j'ai besoin. –

+0

Pourquoi n'acceptez-vous pas la réponse? – blockhead

+0

Endormi, désolé. –

0
$green_car->get_color() 

sera équivalent à

call_user_func(array($$instance_name, 'get_color')) 
0

Je ne sais pas pourquoi besoin d'appeler l'instance "par nom", vous passez habituellement juste l'instance en tant que paramètre ou l'affecter à une autre variable. Par défaut, PHP5 va juste faire une autre référence à la classe, pas la copier. Mais vous pouvez utiliser = & pour faire bonne mesure et rendre évident ce que vous faites.

$blue_car = new Car('blue'); 
$red_car = new Car('red'); 

$current_car =& $blue_car 
$current_car->get_color(); // returns blue car's color 

$current_car =& $red_car 
$current_car->get_color(); // returns red car's color 
Questions connexes