php中类外部访问类私有属性的方法
2014-12-20 10:59
603 查看
我们都知道,类的私有属性在类外部是不可访问的,包括子类中也是不可访问的。比如如下代码:
但某些情况下我们需要访问类的私有属性,有下面这么几种方法可以实现:
1.利用反射
2.利用Closure::bind()
此方法是php 5.4.0中新增的。
另外,我们也可以用引用的方式来访问,这样我们就可以修改类的私有属性:
据此,我们可以封装一个函数来读取/设置类的私有属性:
Closure::bind()还有一个很有用之处,我们可以利用这一特性来给一个类动态的添加方法。官方文档中给了这么一个例子:
<?php class Example1{ private $_prop = 'test'; } $r = function(Example1 $e){ return $e->_prop; }; $a = new Example1(); var_dump($r($a)); //运行结果:Fatal error: Cannot access private property Example1::$_prop ?>
但某些情况下我们需要访问类的私有属性,有下面这么几种方法可以实现:
1.利用反射
<?php class Example1{ private $_prop = 'test'; } $r = function(Example1 $e){ return $e->_prop; }; $a = new Example1(); $rfp = new ReflectionProperty('Example1','_prop'); $rfp->setAccessible(true); var_dump($rfp->getValue($a)); //结果输出:string 'test' (length=4) ?>
2.利用Closure::bind()
此方法是php 5.4.0中新增的。
<?php class Example1{ private $_prop = 'test'; } $r = function(Example1 $e){ return $e->_prop; }; $a = new Example1(); $r = Closure::bind($r,null,$a); var_dump($r($a)); //结果输出:string 'test' (length=4) ?>
另外,我们也可以用引用的方式来访问,这样我们就可以修改类的私有属性:
<?php class Example1{ private $_prop = 'test'; } $a = new Example1(); $r = Closure::bind(function & (Example1 $e) { return $e->_prop; }, null, $a); $cake = & $r($a); $cake = 'lie'; var_dump($r($a)); //结果输出:string 'lie' (length=3)
据此,我们可以封装一个函数来读取/设置类的私有属性:
<?php $reader = function & ($object, $property) { $value = & Closure::bind(function & () use ($property) { return $this->$property; }, $object, $object)->__invoke(); return $value; }; ?>
Closure::bind()还有一个很有用之处,我们可以利用这一特性来给一个类动态的添加方法。官方文档中给了这么一个例子:
<?php trait MetaTrait { private $methods = array(); public function addMethod($methodName, $methodCallable) { if (!is_callable($methodCallable)) { throw new InvalidArgumentException('Second param must be callable'); } $this->methods[$methodName] = Closure::bind($methodCallable, $this, get_class()); } public function __call($methodName, array $args) { if (isset($this->methods[$methodName])) { return call_user_func_array($this->methods[$methodName], $args); } throw RunTimeException('There is no method with the given name to call'); } } class HackThursday { use MetaTrait; private $dayOfWeek = 'Thursday'; } $test = new HackThursday(); $test->addMethod("addedMethod",function(){ return '我是被动态添加进来的方法'; }); echo $test->addedMethod(); //结果输出:我是被动态添加进来的方法 ?>
相关文章推荐
- PHP面向对象----(私有属性的访问方法)
- PHP 一种访问私有属性的方法
- PHP实现在对象之外访问其私有属性private及保护属性protected的方法
- 用简单的方法来访问GObject对象的私有属性
- 私有成员函数外部访问方法
- WampServer PHP服务配置方法(允许外部访问、phpmyadmin设置为输入用户名密码才可登录等)
- php __set() __get() 方法访问属性
- 从外部访问类中的私有方法的方法
- 利用反射访问私有属性、调用私有方法
- 在使用私有属性公有方法访问的时候在get方法里使用判断
- 子类会继承父类的私有方法和私有属性,只是不能直接访问
- Java反射之访问私有属性或方法
- Java内存理解 && 反射访问私有属性或方法
- java利用反射访问类的私有(private)属性及方法
- java反射访问私有属性和方法
- 关于访问控制的一首PHP面试题(对属性或方法的访问控制)
- GObject 子类私有属性的外部访问
- java 反射方式访问私有属性和方法
- 通过反射访问任意类的私有方法和属性
- java(非)静态方法,(非)静态外部类访问静态属性总结