php反射机制学习
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.
php反射机制学习的更多相关文章
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java反射机制学习小结
之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...
- java反射机制学习笔记
内容引用自:https://www.cnblogs.com/wkrbky/p/6201098.html https://www.cnblogs.com/xumBlog/p/8882489.html,本 ...
- Java反射机制——学习总结
前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
- Java反射机制学习
Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...
- C#反射机制学习总结
反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Syste ...
- JAVA反射机制学习随笔
JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...
随机推荐
- linux查看某个目录下有哪些文件的命令
分别是ll和ls命令 ll /usr/local/lib ls /usr/local/lib
- Windows下MySQL免安装版的安装、卸载
一.安装 1.下载 到MySQL官网http://dev.mysql.com/downloads/mysql/ 下载mysql-5.6.15-win32.zip. 2.拷贝 将mysql-5.6.15 ...
- TensorFlow函数:tf.FIFOQueue队列
转载:https://blog.csdn.net/akadiao/article/details/78552037 tf.FIFOQueue tf.FIFOQueue继承基类QueueBase. Qu ...
- Oracle 11g trace events
oracle的events,是我们在做自己的软件系统时可以借鉴的 Oracle 11g trace eventsORA-10001: control file crash event1ORA-1000 ...
- Java集合入门
内容: 1.认识集合 2.Iterator迭代器 1.认识集合 (1)什么是集合 前面的学习,我们知道数据多了,使用数组存放.而且数组中存放的都是基本类型的数据,并且数组是定长的. 当在程序中创建的对 ...
- vb 使用StreamWriter书写流写出数据并生成文件
sql = "Select case when date ='' then '0'else CONVERT(varchar(100), date, 101) end as date,case ...
- Mysql-事务,原子性操作
事物分为 自动(默认的)和手动(需开启事务)两种 -- 事务 start transaction; -- commite; 提交事务 -- rollback; 回滚事务 create table if ...
- sts安装出现could not find jar:file解决办法
转自:https://blog.csdn.net/weixin_43702329/article/details/84823912 标题sts插件下载好但是安装出错 我的eclipse是4.5.2,在 ...
- indy字符编码
以前是TEncoding.Unicode 现在是IndyTextEncoding_Default
- VBA 公式中使用相对位置
.Cells(3, 4).FormulaR1C1 = "=sum(r[-" & a & "]c[0]:r[-3]c[" & b & ...