韦德国际_韦德国际1946官方网站_韦德国际1946手机版
做最好的网站

浅谈PHP的反光机制,浅谈反射机制

日期:2019-07-10编辑作者:韦德国际1946官方网站

1. 介绍

初稿地址:

介绍:

PHP5增加了一项新的法力:Reflection。那一个效应使得phper能够reverse-engineer class, interface,function,method and extension。通过PHP代码,就能够取得某object的具备音讯,何况能够和它交互。
反射是何许?
它是指在PHP运市价况中,增添分析PHP程序,导出或提收取关于类、方法、属性、参数等的详细消息,富含注释。这种动态获取的音信以及动态调用对象的方法的意义称为反射API。反射是调节面向对象范型巧月模型的API,其效果极其强有力,可支持大家构建复杂,可扩张的选用。
其用途如:自动加载插件,自动生成文书档案,乃至可用来扩充PHP语言。
php反射api由若干类组成,可援救我们用来访谈程序的元数据照旧同有关的笺注交互。借助反射我们能够获得诸如类达成了那多少个方法,成立多少个类的实例(差异于用new成立),调用八个艺术(也差异于常规调用),传递参数,动态调用类的静态方法。
      反射api是php内建的oop本领扩充,包括部分类,卓殊和接口,综合应用他们可用来帮忙我们深入分析任何类,接口,方法,属性,方法和增添。那一个oop扩大被誉为反射。
      通过ReflectionClass,大家得以拿走Person类的以下消息:
     1)常量 Contants
     2)属性 Property Names
     3)方法 Method Names静态
     4)属性 Static Properties
     5)命名空间 Namespace
     6)Person类是还是不是为final大概abstract

简介

哪怕是类成员定义为private也足以在外部访谈,不用创造类的实例也可以访谈类的成员和措施。

PHP自5.0版本之后增加了反光机制,它提供了一套庞大的反射API,允许你在PHP运转情状中,访谈和选用类、方法、属性、参数和注释等,其功能非常无敌,平时用来高扩张的PHP框架,自动加载插件,自动生成文书档案,甚至足以用来扩大PHP语言。由于它是PHP內建的oop扩充,为语言本身自带的特征,所以无需卓绝增多扩大或许配置就可以应用。更加多内容见官方文书档案。

-- PHP5加多了一项新的功效:Reflection。那个功能使得phper能够reverse-engineer class, interface,function,method and extension。通过PHP代码,就足以博得某object的兼具消息,何况能够和它交互。

例子

class Person {  
    /** 
     * For the sake of demonstration, we"re setting this private
     */ 
    private $_allowDynamicAttributes = false;

    /** type=primary_autoincrement */
    protected $id = 0;

    /** type=varchar length=255 null */
    protected $name;

    /** type=text null */
    protected $biography;

        public function getId()
        {
            return $this->id;
        }
        public function setId($v)
        {
            $this->id = $v;
        }
        public function getName()
        {
            return $this->name;
        }
        public function setName($v)
        {
            $this->name = $v;
        }
        public function getBiography()
        {
            return $this->biography;
        }
        public function setBiography($v)
        {
            $this->biography = $v;
        }
}

浅谈PHP的反光机制,浅谈反射机制。接下去反射它,只要把类名"Person"传递给ReflectionClass就能够了:

$class = new ReflectionClass('Person');//建立 Person这个类的反射类
$instance  = $class->newInstanceArgs($args);//相当于实例化Person 类

反射类型

PHP反射API会基于类,方法,属性,参数等有限支撑相应的反射类,已提供相应的调用API。

类型 说明
Reflector Reflector 是一个接口,被所有可导出的反射类所实现(implement)
Reflection 反射(reflection)类
ReflectionClass 报告了一个类的有关信息
ReflectionZendExtension 报告Zend扩展的相关信息
ReflectionExtension 报告了PHP扩展的有关信息
ReflectionFunction 报告了一个函数的有关信息
ReflectionFunctionAbstract ReflectionFunction 的父类
ReflectionMethod 报告了一个方法的有关信息
ReflectionObject 报告了一个对象(object)的相关信息
ReflectionParameter 取回了函数或方法参数的相关信息
ReflectionProperty 报告了类的属性的相关信息

-- 反射是如何?

1)获取属性(Properties):

$properties = $class->getProperties();
foreach($properties as $property) {
    echo $property->getName()."n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

暗许情状下,ReflectionClass会获取到独具的天性,private 和 protected的也能够。借使只想赢获得private属性,将要相当传个参数:
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
可用参数列表:
               ReflectionProperty::IS_STATIC
               ReflectionProperty::IS_PUBLIC
               ReflectionProperty::IS_PROTECTED
               ReflectionProperty::IS_PRIVATE
     假诺要同一时间获得public 和private 属性,就那样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。
   通过$property->getName()可以猎取属性名。

访问

举个例子定义了多个类 User,大家先是须要树立这些类的反射类实例,然后依照那个实例能够访问 User 中的属性大概措施。不管类中定义的成员权限评释是不是为public,都得以得到到。

<?php 
namespace Extend;

use ReflectionClass;
use Exception;

/**
 * 用户相关类
 * Class User
 * @package Extend
 */
class User{
    const ROLE = 'Students';
    public $username = '';
    private $password = '';

    public function __construct($username, $password)
    {
        $this->username = $username;
        $this->password = $password;
    }

    /**
     * 获取用户名
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * 设置用户名
     * @param string $username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    }

    /**
     * 获取密码
     * @return string
     */
    private function getPassword()
    {
        return $this->password;
    }

    /**
     * 设置密码
     * @param string $password
     */
    private function setPassowrd($password)
    {
        $this->password = $password;
    }
}

$class = new ReflectionClass('ExtendUser');  // 将类名User作为参数,即可建立User类的反射类
$properties = $class->getProperties();  // 获取User类的所有属性,返回ReflectionProperty的数组
$property = $class->getProperty('password'); // 获取User类的password属性ReflectionProperty
$methods = $class->getMethods();   // 获取User类的所有方法,返回ReflectionMethod数组
$method = $class->getMethod('getUsername');  // 获取User类的getUsername方法的ReflectionMethod
$constants = $class->getConstants();   // 获取所有常量,返回常量定义数组
$constant = $class->getConstant('ROLE');   // 获取ROLE常量
$namespace = $class->getNamespaceName();  // 获取类的命名空间
$comment_class = $class->getDocComment();  // 获取User类的注释文档,即定义在类之前的注释
$comment_method = $class->getMethod('getUsername')->getDocComment();  // 获取User类中getUsername方法的注释文档

留神:成立反射类时传送的类名,必须含有完整的命名空间,即便使用了 use 关键字。否则找不到类名会抛出十三分。

它是指在PHP运市价况中,增加深入分析PHP程序,导出或提抽取有关类、方法、属性、参数等的详细音讯,包蕴注释。这种动态获取的消息以及动态调用对象的点子的效劳称为反射API。反射是决定面向对象范型兰月模型的API,其成效相当精锐,可帮助大家营造复杂,可扩展的利用。

2)获取注释:

 通过getDocComment能够获得写给property的注释。

foreach($properties as $property) {
    if($property->isProtected()) {
        $docblock = $property->getDocComment();
        preg_match('/ type=([a-z_]*) /', $property->getDocComment(), $matches);
        echo $matches[1]."n";
    }
}
// Output:
// primary_autoincrement
// varchar
// text

交互

要是创造了反射类的实例,我们不仅可以够通过反射类访谈原来类的秘籍和总体性,还能够成立原本类的实例或则直接调用类里面包车型地铁议程。

$class = new ReflectionClass('ExtendUser');  // 将类名User作为参数,即可建立User类的反射类
$instance = $class->newInstance('youyou', 1, '***');  // 创建User类的实例

$instance->setUsername('youyou_2');  // 调用User类的实例调用setUsername方法设置用户名
$value = $instance->getUsername();   // 用过User类的实例调用getUsername方法获取用户名
echo $value;echo "n";   // 输出 youyou_2

$class->getProperty('username')->setValue($instance, 'youyou_3');  // 通过反射类ReflectionProperty设置指定实例的username属性值
$value = $class->getProperty('username')->getValue($instance);  // 通过反射类ReflectionProperty获取username的属性值
echo $value;echo "n";   // 输出 youyou_3

$class->getMethod('setUsername')->invoke($instance, 'youyou_4'); // 通过反射类ReflectionMethod调用指定实例的方法,并且传送参数
$value = $class->getMethod('getUsername')->invoke($instance);    // 通过反射类ReflectionMethod调用指定实例的方法
echo $value;echo "n";   // 输出 youyou_4

try {
    $property = $class->getProperty('password_1');
    $property->setAccessible(true);   // 修改 $property 对象的可访问性
    $property->setValue($instance, 'password_2');  // 可以执行
    $value = $property->getValue($instance);     // 可以执行
    echo $value;echo "n";   // 输出 password_2
    $class->getProperty('password')->setAccessible(true);    // 修改临时ReflectionProperty对象的可访问性
    $class->getProperty('password')->setValue($instance, 'password');// 不能执行,抛出不能访问异常
    $value = $class->getProperty('password')->getValue($instance);   // 不能执行,抛出不能访问异常
    $value = $instance->password;   // 不能执行,类本身的属性没有被修改,仍然是private
}catch(Exception $e){echo $e;}

其用途如:自动加载插件,自动生成文书档案,乃至可用来扩张PHP语言。

3)获取类的办法

赢得方式(methods):通过getMethods() 来博取到类的享有methods。

注意事项

  1. 一向访问 protected 或则 private 的耳濡目染大概方法会抛出十分
  2. 急需调用内定的 ReflectionProperty 或则 ReflectionMethod 对象 setAccessible(true)方法技能访谈非公有成员
  3. 修改非公有成员的会见权限只效劳于近年来的反射类的实例
  4. 内需小心获取静态成员和非静态成员所使用的格局不相同
  5. 获取父类成员的法子和一般的差异

一时光会料理出反射类的API表,详细的API列表能够先查看法定文书档案。

php反射api由若干类组成,可扶助大家用来做客程序的元数据只怕同相关的注明交互。借助反射大家得以拿走诸如类完成了那么些方法,创制二个类的实例(不一样于用new创造),调用三个办法(也差异于常规调用),传递参数,动态调用类的静态方法。

4)推行类的不二秘诀:

$instance->getBiography(); //执行Person 里的方法getBiography
//或者:
$ec=$class->getmethod('getName');  //获取Person 类中的getName方法
$ec->invoke($instance);       //执行getName 方法

反射api是php内建的oop技巧扩大,包蕴一些类,格外和接口,综合运用他们可用来扶持我们解析任何类,接口,方法,属性,方法和扩展。那几个oop扩张被称之为反射。

由此ReflectionClass,大家得以拿走Person类的以下新闻:

1)常量 Contants

2)属性 Property Names

本文由韦德国际发布于韦德国际1946官方网站,转载请注明出处:浅谈PHP的反光机制,浅谈反射机制

关键词: PHP

韦德国际1946官方网站:用法实例,json_encode与j

一、json_encode() /* json_encode - 重返二个值的JSON格式数组 json_encode — Returns the JSON representation of a value json_encode()和json...

详细>>

php中抓取网页内容的实例详解,php中抓取网页内

php中抓取网页内容的实例详解 php中抓取网页内容的实例详解,抓取网页内容 php中抓取网页内容的实例详解 方法一:...

详细>>

ubuntu编写翻译安装php5,编写翻译安装nginx

参考: -1. 筹算干活 一、首先下载软件源码包 wget wgethttp:/.s135.com/soft/Linux/nginx_php/php/php-5.2.10.tar.gz wgethttp:/.s135.com/so...

详细>>

高等课程笔记,PHP高端笔记汇总

高等篇少校涉及数据库的利用以及Cookie和Session会话,升高PHP的开销功用和周转功效 一、PHP日期 例一:   PHP的date()函...

详细>>