您好,欢迎访问成都祈钰瑶科技有限公司!

全国咨询热线

18982081108
✕

成都网站建设公司,成都网站UI设计,成都网站安全维护,成都网站内容优化服务

php类成员函数二次定义,动态定义类成员函数-创新互联

这是一个很怪异的想法:class类定义之后,甚至编译载入内存之后,还有没有办法增加其成员函数,改写其已有成员函数逻辑!意义不是特别大,只是觉得很有意思, php太神奇了!!!

在孝感等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、成都网站建设 网站设计制作按需策划设计,公司网站建设,企业网站建设,品牌网站设计,全网整合营销推广,成都外贸网站制作,孝感网站建设费用合理。

【应用场景】
1) 动态载入类成员函数体(一些常住内存框架,修改的代码需要重载服务,可以动态多次载入扩展函数文件)
2) 团队开发写同一个类文件的避免冲突,自己单独可以一个扩展文件;
3) 一个类的代码太多太多,将一些成员函数分解到多个文件中实现;
4) php类运行中按需加载成员函数体内容;

【实现原理】
用类的静态变量来保存扩展的函数,用__call魔术方法来实现扩展函数的真实调用;

【例子】

<?php
#
# 定义一个user类
#
class user{
    static  $funcs=array();   
    #用于动态扩展或覆盖类的成员函数名及函数体 
    static  function ext($method,$func){self::$funcs[$method]=$func;}
    //调用一个不存在的方法 
   function __call($func, $args) {
      //可以考虑根据函数名载入定义文件 user.ext.{func}.php
        if(isset(self::$funcs[$func])){
            $classFunc=self::$funcs[$func];
            array_unshift($args,$this);
            return call_user_func_array($classFunc,$args);
        }
        echo  "{$func}方法真的真的真的未定义!";
  }
  #其他成员函数
  function getC(){
      return 8;
  }

}

/////////////定义代码//////////////////
#第一个参数为成员函数名,函数的第一个参数$pthis 相当$this
user::ext('add',function($pthis,$a,$b){ 
    $n=$pthis->getC();
    return $n+$a+$b;

});

//////////////调用代码///////////
$user=new user();
$num=$user->add(1,2);
//8+1+2=11
var_dump($num);

/////////运行中再次定义/////////////////
user::ext('add',function($pthis,$a,$b){
    $n=$pthis->getC();
    return $n*$a*$b;
});

$num=$user->add(1,2);
//8*1*2=16
var_dump($num);

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。