2009-10-16 4 views
1

개체의 클래스를 현재 클래스와 비교하고 상속 된 메서드에서 부모 클래스를 참조하려고합니다. 이것은 내가 그 일을 생각할 수있는 유일한 방법입니다 : 자기가 상속 방법에서 상위 클래스를 참조하기 때문에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 

이 작동하지만, 내가 비교를 할 클래스마다의 인스턴스를 가지고 과도한 것 같다 .

더 간단한 방법이 있습니까?

return get_class($obj) == __CLASS__; 

심지어 단지 인수없이 get_class()을 사용합니다 :

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

답변

4

당신은 __CLASS__magic constant가 사용할 수 있습니다.

당신은 클래스가 인터페이스를 구현 또는 추상 클래스를 확장 있는지 확인하려면 그것은 매우 유용
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 

(플러그인, 어댑터, 즉 ...)

+0

아 내가 볼! __CLASS__ 및 get_class()는 상속 된 메서드에서 self와 동일한 비헤이비어를가집니다. 고마워요! 내 친구도 내게 우아한 해결책을주었습니다. return $ obj instanceof self; – peterjwest

+1

$ obj instanceof self는 작동하지 않습니다 : $ bar-> compare (new bar); 사실 일 것입니다 – Greg

+0

고마워요, 저는 방금 나 자신을 위해 이것을 발견했습니다! – peterjwest

0

예는 확실히 있지만, 상속 조심

+0

유용한 이유가 무엇인지 잘 모르겠습니까? – peterjwest

+0

'$ bar = new Bar(); if ($ bar instanceof Foo)'가 true를 반환하면 귀하의 경우에는 예상되는 동작이 아닐 수도 있습니다 ... –

+0

오, 죄송합니다. 고마워, 나는 그 행동을 알고있다 :) – peterjwest

관련 문제