您的位置:首页 > 编程语言 > PHP开发

php反射机制学习

2016-04-28 00:28 686 查看
  PHP 5 具有完整的反射 API,可以通过反射机制来获取类,接口,函数的详细信息。例如可以通过反射api的成员属性,成员方法,命名空间的名称,检测某个类是否为抽象类等操作。(欢迎指点)

一般用途是在框架中配合自动加载类来完成 对类的实例化操作。

  1.建立一个Person类的反射类,然后实例化此类。

<?php
class Person {
/**
* demo
*/
private $_allowDynamicAttributes = false;

/** demo*/
public $id = 0;

/** demo */
protected $name = 'lemon';

/** demo */
protected $biography;

public function getName()
{
return $this->name;
}
public function setName($v)
{
$this->name = $v;
}
}

//建立 Person这个类的反射类
$class = new ReflectionClass('Person');

//相当于实例化Person 类
$instance  = $class->newInstanceArgs([]);


  2.获取属性

$properties = $class->getProperties();
foreach($properties as $property) {
echo $property->getName()."\n";
}


默认情况下,getProperties会获取到所有的属性,pulbic,private,protected.如果只想获取到private属性,就要额外传个参数:

 可用参数列表:

  ReflectionProperty::IS_STATIC
  ReflectionProperty::IS_PUBLIC
  ReflectionProperty::IS_PROTECTED
  ReflectionProperty::IS_PRIVATE
  如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED。

3.获取方法

$methods = $class->getMethods();
foreach($methods as $method) {
echo $method->name.PHP_EOL;
}


4.执行方法

//获取Person 类中的getName方法
echo $instance->getName();
//或者
$re = $class->getmethod('getName');
echo $re->invoke($instance);


5.和自动加载类配合实例化某类

目录结构 d代表目录,f代表文件

  Reflection (d)

  Reflection6.php (f)

  loader.php (f)

  ----vendor (d)

    ----A(d)

      ----A.php (f)

Reflection6.php 文件

<?php
namespace Reflection;

require 'loader.php';
call_user_func_array([new \ReflectionClass('vendor\A\A'),'newInstance'],['demo']);


 loader.php 文件

<?php
function loader($classname)
{
$fullfile = '';
if (($index = strripos($classname,'\\')) !== false){
$namespace = substr($classname,0,$index);
$classname = substr($classname,$index+1).'.php';
$fullfile = __DIR__.DIRECTORY_SEPARATOR.$namespace.DIRECTORY_SEPARATOR.$file;
$fullfile = str_replace('\\','/',$fullfile);
}

if (file_exists($fullfile)) {
require $fullfile;
}
}

spl_autoload_register('loader');


A.php

<?php
namespace vendor\A;

class A
{
private $name = 'zc';

public function __construct()
{
echo 'this is '.func_get_args()[0];
}

}


浏览器输出 this is demo.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: