时间:2021-07-01 10:21:17 帮助过:36人阅读
最为重要的是动态扩展的方法也是支持访问对象内部私有属性和方法噢!!
/**
* 超级方法
* Class SuperMethod
*/
class SuperMethod{
private $_bind_function_map=array();
private $_friend_call_in_progress=0;
function __call($name, $arguments)
{
if(isset($this->_bind_function_map[$name])){
$this->_friend_call_in_progress++;
try{
$res=call_user_func_array($this->_bind_function_map[$name],$arguments);
$this->_friend_call_in_progress--;
}catch (\Exception $e){
$this->_friend_call_in_progress--;
throw $e;
}
return $res;
}else{
if($this->_friend_call_in_progress){
$arguments['_friend_call']=$name;
return call_user_func($this,$arguments);
}
}
}
function __invoke($args)
{
if(isset($args['_friend_call'])){
$friend_call=$args['_friend_call'];
unset($args['_friend_call']);
return $this->$friend_call(...$args);
}
}
function __set($name, $value)
{
if($value instanceof Closure){
$this->_bind_function_map[$name]=$value->bindTo($this);
}
}
function __get($name)
{
if($this->_friend_call_in_progress){
return $this->$name;
}
}
}
class test extends SuperMethod{
protected $name='';
public function __construct($name='')
{
$this->name=$name;
}
protected function haha(){
phpinfo();
}
}
$o=new test('xbs');
//里面可以访问对象私有以及受保护方法噢
$o->say_hello=function(){
var_dump($this->name);
$this->haha();
};
$o->say_hello();
怎么样使用简单吧!!
作者:xbs530 QQ:987188548
PS:没事可以多多交流技术噢!
以上就介绍了像javascript一样动态为PHP对象增加方法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。