在学习PHP对象特性的时候,偶然在网上看到能够通过映射直接获取到定义类的所有属性和方法,之前有听说过映射这个名词,一直觉得是一种很高大上的用法和概念,现在来看看到底是个什么玩意。
这篇文章主要介绍如何通过使用映射的方式来获取一个类中已定义的成员变量和成员函数。
映射
PHP官网上在 ReflectionClass 简介上有这么一句
The ReflectionClass class reports information about a class.
这是目前我通过搜集资料关于映射的认识——通过映射类,我们能够获取到一个类中定义的方法和信息。
新建一个基类 parents :
class parents{
public $name;
private $sex;
public $age;
public function __construct($output){
$this->name = 'I am parent;';
$this->sex = 'women';
$this->age = '886';
}
public function talk( $parameter){
$accessss = 'name';
$this->$accessss = $parameter;
echo $this->$accessss;
}
private function ptalk(){
echo "I am parent";
}
}
我们希望在代码使用的过程中获取这个基类中定义了哪些变量和方法,我们需要实例化一个ReflectionClass 类,然后调用相应的方法:
$ref = new ReflectionClass( 'parents' ) // 注意这里接收的是类名,字符串变量
var_dump( $ref->getMothods() );
var_dump( $ref->getProperties() );
运行结果
从上面的结果我们能看到,调用实例化后的 ReflectionClass对象方法后,我们能获得对应的关联数组。
返回的关联数组里我们不仅能看到公有成员的信息,私有成员变量和成员函数也被返回到数组之中。
这样的方式意味着,在我们程序执行的过程中程序本身能够动态的看见这个类中的所有信息,并进行相应的调用。但是我很好奇这样的设计会用在哪呢?
相比于让程序获取到一个类的所有信息,为什么不在编程时人为的去分析调用这个类呢?这不是比让程序去做这件事更有效率?
这就牵涉到映射的使用场景,这个也是从网上博客得来的信息,兴许会有些片面。
映射一般会使用在控制反转,框架设计上
而控制反转是一种设计思想,主要是解决代码之间的耦合问题,这里不做展开讨论,我们介绍控制反转的一种形式——注入依赖。
注入依赖是为了解决类与类之间的引用问题,这种设计模式希望通过第三方来控制在类之内的类的引入,
这种引入不同于直接在程序代码中new,而是通过第三方来检索要引入的类,然后调用的类中的方法。
那么,我认为映射就是起到帮助这个第三方去完成这一过程所要借助的功能。
那是不是说,依赖注入的实现方式需要借助映射这一功能呢?
这里待定。待以后涉及到相关的业务场景后,想必会有更深的认识。
最后
映射这个功能,从上面的介绍来看倒是并没有多难,但是所在的业务场景可能是一般接触不到的,但是不要紧,我又了解了一个高大上的概念。