php高级特性之反射

薄洪涛7年前PHP1380

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

首先声明一点,反射在实际开发中用的很少(至少我没用过),但是在编写文档的时候,可以用于文档的生成;用于探索类的内部,比较灵活这是优点,缺点就是破坏了类的封装性,使得一些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


标签: 反射

相关文章

五十个小技巧提高PHP执行效率

    在项目开发过程中,经常遇到了一些PHP处理程序性能底下的情况,程序运行在centos+nginx环境,虽然这个有很多的原因如:服务器本身配置,运行环境n...

PHP程序猿食用RabbitMQ方法

消息队列是什么?“消息队列”是在消息的传输过程中保存消息的容器。“消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。消息被发送到队列中。“消...

redis持久化的两种方式

redis持久化的两种方式

redis为了内存数据的安全考虑,会把内存中的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。数据保存到硬盘的过程就称为“持久化”效果。redis支持...

Elasticsearch为什么搜索那么快?

Elasticsearch为什么搜索那么快?

介绍Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lu...

Elasticsearch第二篇之数据操作

    上一篇向大家讲解了Elasticsearch的部署安装和基本设置,这篇文章就和大家一起熟悉下Elastic的数据库操作,和普通数据库不同,es库需要公告...

[Err] 1071 - Specified key was too long; max key length is 767 bytes

做数据库sql导入的时候,报错,[Err] 1071 - Specified key was too long; max key length is 767 bytes修正方法set glo...

发表评论    

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