首页 >

php Reflection反射机制实例详解

后端开发|php教程php Reflection反射机制实例详解
Reflection,php,详解
后端开发-php教程
PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以
360杀毒源码,vscode插不了图片,ubuntu配置rcs,tomcat常见攻击,sqlite数据库相关命令,爬虫时服务器数据量大,进销存系统 php,外贸推广seo怎么收费,好的网站代码是什么,如何 html5 网站模板lzw
reverse-engineer[逆向工程] class, interface,function,method and extension[扩展库支持]。
个人简约业务网站源码,vscode网页预览的插件,ubuntu操作历史,tomcat爆出高危漏洞,spyder爬虫需求,php生成长微博,seo推广和竞价推广营销,网站源码可以做什么,分销王2 模板lzw
通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。
植物大件僵尸修改器源码,vscode 源代码管理,更新ubuntu vi,启动tomcat打印日志,爬虫发文,php 数组 josn,宁波seo推广方式运营,全屏网站源码 带会员,phpcms登录页面模板lzw
如假设以下Person类:

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;    }}

通过ReflectionClass,我们可以得到Person类的以下信息:

常量 Contants

属性 Property Names

方法 Method Names

静态属性 Static Properties

命名空间 Namespace

Person类是否为final或者abstract

只要把类名”Person”传递给ReflectionClass就可以了:

 $class = new ReflectionClass('Person');

* 获取属性(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()可以得到属性名,通过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

有点不可思议了吧。竟然连注释都可以取到。

* 获取方法(methods):通过getMethods() 来获取到类的所有methods。返回的是ReflectionMethod对象的数组。

不再演示。

* 最后,通过ReflectionMethod来调用类里面的method。

$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer");foreach($data as $key => $value) {    if(!$class->hasProperty($key)) {        throw new Exception($key." is not a valid property");    }     if(!$class->hasMethod("get".ucfirst($key))) {        throw new Exception($key." is missing a getter");    }     if(!$class->hasMethod("set".ucfirst($key))) {        throw new Exception($key." is missing a setter");    }     // Make a new object to interact with    $object = new Person();     // Get the getter method and invoke it with the value in our data array    $setter = $class->getMethod("set".ucfirst($key));    $ok = $setter->invoke($object, $value);     // Get the setter method and invoke it    $setter = $class->getMethod("get".ucfirst($key));    $objValue = $setter->invoke($object);     // Now compare    if($value == $objValue) {        echo "Getter or Setter has modified the data.\n";    } else {        echo "Getter and Setter does not modify the data.\n";   }}

php Reflection反射机制实例详解
  • PHP Reflection API详解【PHP】
  • PHP Reflection API详解【PHP】 | PHP Reflection API详解【PHP】 ...

    php Reflection反射机制实例详解
  • PHP 反射(Reflection)用法示例代码
  • PHP 反射(Reflection)用法示例代码 | PHP 反射(Reflection)用法示例代码 ...

    php Reflection反射机制实例详解
  • PHP MVC 模式(1)
  • PHP MVC 模式(1) | PHP MVC 模式(1) ...