zoukankan      html  css  js  c++  java
  • 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 更多的知识请参考手册

  • 相关阅读:
    solidworks中的一些标注尺寸的技巧
    SolidWorks 2-8草图绘制的一般过程
    SolidWorks 2-7 草图的约束【课程来自虎课网】
    SolidWorks 2-5 草图的编辑
    HTML 文本格式化实例--实体
    今天长进之redis的学习
    初步了解Quartz
    职场风云3
    内网穿透
    职场风云2
  • 原文地址:https://www.cnblogs.com/uduemc/p/4055092.html
Copyright © 2011-2022 走看看