PHP反射API—Reflection

原创 木鱼  2017-08-21 10:57  阅读 61 次

介绍

反射是PHP5中的一个新特性,它由一系列可以分析属性、方法和类的内置类组成。

其实反射和某些函数非常类似,比如get_class_vars()、get_class_methods();不过反射API更加强大,更加灵活。

它可以与PHP最新的面向对象特性一起工作,如访问控制、接口和抽象类等。而那些函数则不太容易。

部分类功能

描述
Reflection 为类的摘要信息提供静态函数export()
ReflectionClass 类信息和工具
ReflectionMethod 类方法信息和工具
ReflectionParameter 方法参数信息
ReflectionProperty 类属性信息
ReflectionFunction 函数信息和工具
ReflectionExtension PHP扩展信息
ReflectionException 错误类

例子

查看信息

我们使用ReflectionClass,查看给定类的所有信息,无论这个类是PHP内置类还是用户自定义类。

先定义一个类:

<?php

class Muyu 
{
    protected $name = 'muyu';
    public $age;
    private $birthday;

    public function __construct ($age)
    {
        $this->age = $age;
    }

    public function printInfo ()
    {
        var_dump(
            $this->name,
            $this->age,
            $this->birthday
        );
    }
}

$muyu = new Muyu(10);
$muyu->printInfo();

结果:

我们使用ReflectionClass查看一下:

<?php

$relClass = new ReflectionClass('Muyu');
Reflection::export($relClass);

输出结果:

(虽然export方法说是会格式化输出结果,但是仅限于命令行模式下,浏览器是一坨的)

我们可以看到属性有几个,属性的访问控制。 

方法有几个,每个方法在文件中的行数是多少,方法需要的参数是否是必须的,方法的访问控制。

用var_dump打印对比一下:

<?php 

$muyu = new Muyu(10);
var_dump($muyu);

结果:

我们不仅要实例化,而且得到的信息也少的可怜

检查类

我们还可以直接ReflectionClass类做更多的操作,我们检查一下‘Muyu’类属于什么类型?

实例化RelfectionClass类:

实例化RelfectionClass并传入到自定义函数classType中

<?php

$relClass = new Reflection('Muyu');
echo classType($relClass);

定义classType函数:

<?php

function classType ( ReflectionClass $class ) 
{
    $result = '';
    $className = $class -> getName();
    if ( $class->isUserDefined() ) {
        $result .= "$className 已定义<br/>";
    }
    if ( $class->isInternal() ) {
        $result .= "$className 是内置类<br/>";
    }
    if ( $class->isInterface() ) {
        $result .= "$className 是接口类<br/>";
    }
    if ( $class->isAbstract() ) {
        $result .= "$className 是抽象类<br/>";
    }
    if ( $class->isFinal() ) {
        $result .= "$className 是final最终类<br/>";
    }
    if ( $class->isInstantiable() ) {
        $result .= "$className 可以实例化<br/>";
    }
    return $result;
}

输出结果:

函数中已经注明ReflectionClass每个方法的意义。

再来说几个:

方法名 含义
getFileName() 类所在的文件名
getStartLine() 类的起始行
getEndLine() 类的终止行

See you 

好了,php的反射已经说了很多了,相信大家对它也已经有一个概念了。

如果有机会我就把进阶一点的也写一写。

写出来的,不说百分百,至少不会是错的,每写一篇文章,都查了很多资料。 手册、论坛、博文、书籍等。

为的就是,可以说的不那么深,但是要说的对。

本文地址:https://www.m5yu.com/php-reflection.html
关注我们:请关注一下我们的微信公众号:扫描二维码,公众号:木鱼博客
版权声明:本文为原创文章,版权归 木鱼 所有,欢迎分享本文,转载请保留出处!

发表评论