2009-10-16 9 views
1

Je veux comparer la classe d'un objet avec la classe courante, et dans les méthodes héritées pour faire référence à la classe parente. Ceci est la seule façon que je peux penser à le faire:Comment puis-je comparer un objet avec la classe parent en PHP?

class foo { function compare($obj) { return get_class($obj) == get_class(new self); } } 
class bar extends foo { } 

$foo = new foo; 
$foo->compare(new foo); //true 
$foo->compare(new bar); //false 
$bar = new bar; 
$bar->compare(new foo); //true 
$bar->compare(new bar); //false 

Cela fonctionne parce que l'auto fait référence à la classe parente des méthodes héritées, mais il semble excessif d'avoir à instancier une classe chaque fois que je veux faire une comparaison .

Y a-t-il un moyen plus simple?

Répondre

4

Vous pouvez utiliser __CLASS__magic constant:

return get_class($obj) == __CLASS__; 

Ou même simplement utiliser get_class() sans argument:

return get_class($obj) == get_class(); 
+0

Oh je vois! __CLASS__ et get_class() ont le même comportement que self dans les méthodes héritées. Merci beaucoup! Mon ami vient aussi de me donner la solution élégante: return $ obj instanceof self; – peterjwest

+1

$ obj instanceof ne fonctionnera pas: $ bar-> compare (nouvelle barre); sera vrai – Greg

+0

Merci, je viens de le découvrir par moi-même! – peterjwest

0

Oui certainement, mais méfiez-vous de l'héritage.

class Foo; 
class Bar extends Foo; 

$foo = new Foo(); 
if($foo instanceof Foo) // true 
if($foo instanceof Bar) // false 

$bar = new Bar(); 
if($bar instanceof Foo) // true 
if($bar instanceof Bar) // true 

Il est très utile si vous voulez vous assurer qu'une classe implémente une interface ou étend la classe abstraite (par exemple pour les plug-ins, adaptateurs, ...)

+0

Je ne comprends pas, si c'est utile, pourquoi devrais-je m'en méfier? – peterjwest

+0

Parce que $ bar = new Bar(); if ($ bar instanceof Foo) 'retourne vrai ce qui pourrait ne pas être attendu comportement dans votre cas ... –

+0

Oh désolé, je n'ai pas tout à fait votre exemple. Merci, je suis conscient de ce comportement :) – peterjwest

Questions connexes