2015-11-26 44 views
6

Tak więc, method_exists() wymaga obiektu, aby sprawdzić, czy istnieje metoda. Ale chcę wiedzieć, czy istnieje metoda z tej samej klasy.Sprawdź, czy metoda istnieje w tej samej klasie.

Mam metodę, która przetwarza pewne informacje i może otrzymać akcję, która uruchamia metodę dalszego przetwarzania tych informacji. Chcę sprawdzić, czy metoda istnieje przed wywołaniem go. Jak mogę to osiągnąć?

przykład:

class Foo{ 
    public function bar($info, $action = null){ 
     //Process Info 
     $this->$action(); 
    } 
} 
+0

Poniższe odpowiedzi są w porządku, tylko dodatkowa uwaga: czy zadałeś sobie pytanie, dlaczego musisz się dowiedzieć, czy metoda istnieje? Ta sytuacja _may_ powstaje, jeśli masz metodę odziedziczoną po klasie nadrzędnej lub nie masz pewności, z czego dziedziczy aktualna klasa. Oba przypadki można załatwić za pomocą interfejsu lub definicji metody abstrakcyjnej. Co jest bardziej przejrzyste i przenosi błąd od środowiska wykonawczego do czasu kompilacji, dlatego jest lepsze. – arkascha

+0

Ponieważ mam inne metody, które są publiczne i dalej przetwarzają te informacje i zwracają przetworzone dane, pierwsza metoda nie zwraca, ponieważ może odbierać dane, które muszą zostać przetworzone i nie musi zwracać niczego. Ale myślałem, że to oszczędność czasu, aby wywołać inną metodę z metody fisrt w razie potrzeby, ale nadal być w stanie wywoływać je osobno. – Rafael

+0

Ale w samej klasie, dlaczego nie jest jasne, czy istnieje metoda? Mam na myśli albo to, że jest zadeklarowane/zaimplementowane w klasie, albo nie jest. Jak i dlaczego powinna to zmieniać w czasie wykonywania? Powiedziałbym, że wiesz dokładnie, czy metoda istnieje. – arkascha

Odpowiedz

21

można zrobić coś takiego:

class A{ 
    public function foo(){ 
     echo "foo"; 
    } 

    public function bar(){ 
     if(method_exists($this, 'foo')){ 
      echo "method exists"; 
     }else{ 
      echo "method does not exist"; 
     } 
    } 
} 

$obj = new A; 
$obj->bar(); 
2

method_exists() przyjmuje albo nazwą klasy lub obiektu przykład jako parametru. Więc można sprawdzić przed $this

http://php.net/manual/en/function.method-exists.php

Parametry

obiektu instancję obiektu lub nazwa klasy

method_name Nazwa metody

+0

Myślę, że dałeś mi link do podręcznika, aby wspierać to, co powiedziałeś, ale w instrukcji mówi, że potrzebuje OBIEKTU. Spróbuję, co powiedziałeś, za chwilę ... – Rafael

+0

podświetlając interesującą część powyżej dla ciebie – Calimero

+0

Ow, (twarz w ziemi), przepraszam = p – Rafael

7

Korzystanie method_exists jest poprawna. Jednak jeśli chcesz aby były zgodne z „Interface Segregacji zasady”, można utworzyć interfejs do wykonywania introspekcji przeciw, tak jak poniżej:

class A 
{ 
    public function doA() 
    { 
     if ($this instanceof X) { 
      $this->doX(); 
     } 

     // statement 
    } 
} 

interface X 
{ 
    public function doX(); 
} 

class B extends A implements X 
{ 
    public function doX() 
    { 
     // statement 
    } 
} 

$a = new A(); 
$a->doA(); 
// Does A::doA() only 

$b = new B(); 
$b->doA(); 
// Does B::doX(), then remainder of A::doA() 
+1

WTF ????? Widzę, że wciąż muszę się wiele nauczyć xD – Rafael

+0

@Rafael Nie uwielbiasz OOP. – Flosculus

+2

Zaczynałem, ale zabiłeś go @Flosculus – Rafael

1

Najlepszym sposobem moim zdaniem jest użycie __call magiczną metodę.

public function __call($name, $arguments) 
{ 
    throw new Exception("Method {$name} is not supported."); 
} 

Tak, można użyć method_exists ($ this ...), ale jest to wewnętrzny sposób PHP.