当前位置:Gxlcms > PHP教程 > 像javascript一样动态为PHP对象增加方法

像javascript一样动态为PHP对象增加方法

时间:2021-07-01 10:21:17 帮助过:36人阅读

还在羡慕javascript可以动态为对象增加方法吗,PHP也是有办法的哟?接着往下看吧!

最为重要的是动态扩展的方法也是支持访问对象内部私有属性和方法噢!!

/**
 * 超级方法
* 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教程有兴趣的朋友有所帮助。

人气教程排行