Nasıl php bir sınıfta başlangıçta * tanımlanan yöntemler * bir listesini alabilirsiniz?

2 Cevap php

Ben aslında (sadece başka bir sınıftan miras değil) belirli bir sınıf için bir tanımı tanımlanan yöntemlerin bir listesini almak çalışıyorum. Örneğin:

class A
{	function bob()
	{
	}
}
class B extends A
{	function rainbrew()
	{
	}

}
class C extends B
{	function bob()
	{
	}
}

echo print_r(get_defined_class_methods("A"), true)."<br>\n";
echo print_r(get_defined_class_methods("B"), true)."<br>\n";
echo print_r(get_defined_class_methods("C"), true)."<br>\n";

Ben sonuç olmak istiyorum:

array([0]=>bob)
array([0]=>rainbrew)
array([0]=>bob)

Bu mümkün mü?

2 Cevap

Sen Reflection Bunun için kullanabilirsiniz:

$reflectA = new ReflectionClass('A');
print_r($reflectA->getMethods());

Bu aslında size ReflectionMethod nesneleri bir dizi verecek, ancak kolayca orada ne gerek tahmin edebilirsiniz. ReflectionMethods Bunun için getDeclaringClass() fonksiyonu sağlamak, böylece işlevleri hangi sınıfta ilan edildiği bulabilirsiniz:

$reflectC = new ReflectionClass('C');
$methods = $reflectC->getMethods();
$classOnlyMethods = array();
foreach($methods as $m) {
    if ($m->getDeclaringClass()->name == 'C') {
    	$classOnlyMethods[] = $m->name;
    }
}
print_r($classOnlyMethods);

Bu verecektir:

Array ( [0] => bob )

Yani, nihai çözüm olarak, bu deneyin:

function get_defined_class_methods($className)
{
    $reflect = new ReflectionClass($className);
    $methods = $reflect->getMethods();
    $classOnlyMethods = array();
    foreach($methods as $m) {
    	if ($m->getDeclaringClass()->name == $className) {
    		$classOnlyMethods[] = $m->name;
    	}
    }
    return $classOnlyMethods;
}

Ben denemedim, ama kullanmak istediğiniz gibi görünüyor get_class_methods

<?php

class myclass {
    // constructor
    function myclass()
    {
        return(true);
    }

    // method 1
    function myfunc1()
    {
        return(true);
    }

    // method 2
    function myfunc2()
    {
        return(true);
    }
}

$class_methods = get_class_methods('myclass');
// or
$class_methods = get_class_methods(new myclass());

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

?>

Yukarıdaki örneğin çıktısı:

sınıfım myfunc1 myfunc2