首页 期权学习期权知识正文

PHP反射类ReflectionClass

xiaojiucai 期权知识 2020-08-18 62 0

今天遇到了这样一个问题,如下代码:

classA.php

<?php
class ClassA{    
    public function funcAa(){   
    }   
    public function funcAb(){   
    }  
    public function funcAc(){
     
    }
}
 
?>

classB.php

<?php
 
include './classA.php';
 
class ClassB extends ClassA{
 
    public function funcBa(){
     
    }
 
    public function funcBb(){
     
    }
 
    public function funcBc(){
     
    }
     
    public function funcAa(){
     
        parent::funcAa();
     
    }
     
}
 
$classB = new ClassB;
 
$classFuncB = get_class_methods($classB);
 
echo '<pre>';
 
print_r($classFuncB);
?>

当我需要找出ClassB里面的所有方法的时候结果如下:

Array

(

    [0] => funcBa

    [1] => funcBb

    [2] => funcBc

    [3] => funcAa

    [4] => funcAb

    [5] => funcAc

)

一共6个方法,实际上我不想要继承了ClassA里面的方法,我只想要ClassB的方法,怎么办呢?我稍微更改了如下:

$classA = new ClassA; 

$classB = new ClassB;

$classFuncA = get_class_methods($classA);

$classFuncB = get_class_methods($classB);

echo '<pre>';

print_r(array_diff($classFuncB,$classFuncA));

结果如下:

Array

(

    [0] => funcBa

    [1] => funcBb

    [2] => funcBc

)

少了一个方法 funcAa ,虽然funcAa是 ClassB 从 ClassA那里继承过来的,但是同样ClassB也有这个方法,所以不是我想要的结果。

解决方法:

$reflection = new ReflectionClass('ClassB');

print_r($reflection->getMethods());

结果:

Array

(

    [0] => ReflectionMethod Object

        (

            [name] => funcBa

            [class] => ClassB

        )

 

    [1] => ReflectionMethod Object

        (

            [name] => funcBb

            [class] => ClassB

        )

 

    [2] => ReflectionMethod Object

        (

            [name] => funcBc

            [class] => ClassB

        )

 

    [3] => ReflectionMethod Object

        (

            [name] => funcAa

            [class] => ClassB

        )

 

    [4] => ReflectionMethod Object

        (

            [name] => funcAb

            [class] => ClassA

        )

 

    [5] => ReflectionMethod Object

        (

            [name] => funcAc

            [class] => ClassA

        )

 

)

可以看到 [4]、[5] 里面的class 对应的值是ClassA,而其他对应的值都是ClassB。通过这个可以用foreach来实现最后想要的结果:

$reflection = new ReflectionClass('ClassB');

 

$array = '';

 

foreach($reflection->getMethods() as $obj){

     

    if($obj->class == $reflection->getName()){    //$reflection->getName()  获取类名

         

        $array[] = $obj->name;

     

    }

 

}

 

echo '<pre>';

 

print_r($array);

最后结果:

Array

(

    [0] => funcBa

    [1] => funcBb

    [2] => funcBc

    [3] => funcAa

)

完成,关于 ReflectionClass 更多的知识请参考手册

原文链接:https://www.qiquanji.com/post/8403.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论