php高级特性之反射

薄洪涛7年前PHP1242

何为反射?字面理解,就是根据到达找到源;在面向对象编程中的反射就是根据对象去找出它所属的类,及类的方法,详情;

首先声明一点,反射在实际开发中用的很少(至少我没用过),但是在编写文档的时候,可以用于文档的生成;用于探索类的内部,比较灵活这是优点,缺点就是破坏了类的封装性,使得一些private方法或者属性暴露出来,这既是优点也是缺点;

看个例子

<?php
/**
 * Created by PhpStorm.
 * User: BoHongtao
 * Date: 2018/10/27
 * Time: 20:43
 */

class Person{
    private $friend;
    public $name;
    public $gender;

    public function say(){
        echo $this->name."is ".$this->gender;
    }

    public function __construct($nama,$gender){
        $this->nama = $nama;
        $this->gender = $gender;
    }

    public function get($name){
        if(isset($this->name))
            return $this->name;
        echo "未设置";
    }
}
$person_1 = new Person('Ming','boy');

// 反射获取类的原型
$obj = new ReflectionClass('person');

$className = $obj->getName();

$Methods = $Properties = array();

foreach($obj->getProperties() as $v)
{
    $Properties[$v->getName()] = $v;
}

foreach($obj->getMethods() as $v)
{
     $Methods[$v->getName()] = $v;
}
echo "class {$className}\n{\n";

is_array($Properties)&&ksort($Properties);

foreach($Properties as $k => $v)
{
    echo "\t";
    echo $v->isPublic() ? ' public' : '',$v->isPrivate() ? ' private' : '',
    $v->isProtected() ? ' protected' : '',
    $v->isStatic() ? ' static' : '';
    echo "\t{$k}\n";
}
echo "\n";
if(is_array($Methods)) ksort($Methods);
foreach($Methods as $k => $v)
{
    echo "\tfunction {$k}(){}\n";
}
echo "}\n";

运行结果

D:\workspace>php Reflection.php
class Person
{
         private friend
         public gender
         public name

        function __construct(){}
        function get(){}
        function say(){}
}

可以看到,我们根据传递的某个对象,就可以得知这个类中的所有属性和方法,哪怕是private


标签: 反射

相关文章

Yii2.0整合ueditor并上传图片到七牛云

Yii2.0整合ueditor并上传图片到七牛云

某个项目要做一个文章模块,用到Ueditor,并且ue中的图片要上传到七牛,所以总结下步骤;1、Yii2.0下载ueditor for Yii2.0和七牛composer require&n...

PostgreSQL教程之安装连接

PostgreSQL教程之安装连接

新公司需要用PostgreSQL数据库,而且网上的资料比较少,先自己整理一下;一、PostgreSQL是什么?PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS)。 用于安全...

谷歌浏览器加载前端资源status=canceled

谷歌浏览器加载前端资源status=canceled

如图,今天在做弹出框(modal中用了iframe)的时候,发现模态框弹出的时候,会有一些前端资源加载被取消,但是也会有加载时间,影响页面的加载速度;然后我尝试用火狐,发现没有这个问题经过一顿goog...

Elasticsearch按照日期聚合

Elasticsearch按照日期聚合

我们现在做的是医疗的业务,有个需求是这样的,查询出某位医生前七天的坐诊记录,并且,医生的坐诊记录是不连续的,这样就需要写一个dsl语句来实现es库的搜索首先我使用了es库中的聚合功能,按照日期去聚合,...

Yii2.0引入Ueditor

Yii2.0 引入Ueditor流程和其他框架不同必须引入Ueditor for Yii2.0,否则不能正常使用1,composer下载 composer require ...

大文件之分片上传

大文件之分片上传

    我们知道,无论是nginx还是php,都会对上传文件的大小做限制,今天刚刚做了一个客户端包的管理,要求上传apk或者ipa文件,而且都不小(超出了php...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。