PHP ana sınıfının yöntemleri hariç, belirli bir sınıfın tüm yöntemlerini, listeleyin

3 Cevap php

Ben PHP için bir birim test çerçeve inşa ediyorum ve bir nesne yöntemleri excludes ana sınıfının yöntemleri bir listesini almak için bir yol olup olmadığını merak ettim. Yani bu Verilen:

class Foo
{

    public function doSomethingFooey()
    {
        echo 'HELLO THERE!';
    }
}

class Bar extends Foo
{
    public function goToTheBar()
    {
        // DRINK!
    }
}

Ben, parametre new Bar() return verilen bir işlevi istiyorum:

array( 'goToTheBar' );

WITHOUT needing to instantiate an instance of Foo. (This means get_class_methods) çalışmayacaktır.

3 Cevap

Örneğin, ReflectionClass kullanın:

$f = new ReflectionClass('Bar');
$methods = array();
foreach ($f->getMethods() as $m) {
    if ($m->class == 'Bar') {
        $methods[] = $m->name;
    }
}
print_r($methods);
$class_methods = get_class_methods('Bar');

From the PHP Documenation

Bu sınıf örneğini olmaz ve sınıfları yöntemlerin hepsi bir dizisini almak için izin verecektir.

Ben bu üst sınıf yöntemleri dönmeyecektir tamamen emin değilim, ama get_class_methods uninstantiated sınıflar için çalışacaktır. Öyle ise, diziden ebeveynin yöntemini kaldırmak için Alix'ın cevap kullanabilirsiniz. Veya Lukman en yöntemleri almak için PHP iç kod tabanının tersine mühendislik yönünü kullanmak için.


Eğer new Bar() yazarsanız BTW, bu Bar Foo uzanır gibi, Foo yeni bir örneğini oluşturmak için gidiyor. Eğer Foo başlatamazsınız tek yolu statik olarak atıfta gereğidir. Bu nedenle, istek:

I want a function which will, given the parameter new Bar() return:

Olası bir çözümü vardır. Eğer verirsen new Bar() bir argüman olarak, bu sınıf örneğini olacaktır.

Sen get_class_methods() sınıfını başlatmasını olmadan kullanabilirsiniz:

$class_name - The class name or an object instance.

Yani şu işe:

$bar_methods = array_diff(get_class_methods('Bar'), get_class_methods('Foo'));

Orada varsayarsak üst sınıf yöntemlerini tekrarlanmaz. Yine de, Lukman's answer daha iyi bir iş yapar. =)