php高级特性之反射

薄洪涛6年前PHP1170

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

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

Yii2.0搭建接口模块教程

最近我需要做一个大项目中的一个模块,考虑用前后端分离,所以想自己搭建一套基于Yii2.0的restful接口出来,本来的时候老大想让我用spring boot,无奈我太菜只会php.....教程开始:...

php redis Hash操作

//为user表中的字段赋值。成功返回1,失败返回0。若user表不存在会先创建表再赋值,若字段已存在会覆盖旧值。 $redis->hSet('user', ...

workerman实现聊天室

workerman实现聊天室

Workerman的一些应用方向如下1、即时通讯类 例如网页即时聊天、即时消息推送、微信小程序、手机app消息推送、PC软件消息推送等等 [示例 workerman-chat聊天室 、&nb...

Laravel打印sql

在AppServiceProvider.php的boot方法中,增加以下代码DB::listen(     function ($sql) ...

Yii2.0 jQuery(...).yiiActiveForm is not a function

Yii2.0 jQuery(...).yiiActiveForm is not a function

记一个常见的错误,如下图当我们在view中创建一个activeForm的时候,有时会报这种错误;通常情况下,是jquery重复引入导致的,因为你引入的jquey的版本跟yii2自带jquery版本冲突...

php程序是如何被解析的?

php程序是如何被解析的?

我们每天都在写php代码,然后往服务器上一丢,你就发现php文件就运行了,嘿,是不是很神奇,但是有没有想过,php是如何被解释执行的呢?要知道apache,nginx都是不能解析.php文件的;所以想...

发表评论    

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