• PHP 反射 ReflectionClass


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

    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 更多的知识请参考手册

  • 相关阅读:
    汉字数组排序及如何检测汉字
    响应式web布局中iframe的自适应
    CSS3的flex布局
    关于BFC不会被浮动元素遮盖的一些解释
    趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别(转载)
    深入seajs源码系列三
    深入seajs源码系列二
    深入seajs源码系列一
    韩国"被申遗" (转自果壳)
    Understanding delete
  • 原文地址:https://www.cnblogs.com/uduemc/p/4055092.html
Copyright © 2020-2023  润新知