PHP 方法重载例子

来源:互联网 发布:java经典编程游戏代码 编辑:程序博客网 时间:2024/04/27 15:05

  PHP通过使用两个魔术方法来实现方法重载:__call和__callStatic。这两个方法在PHP文档中描述如下:

1public mixed __call ( string $name , array $arguments )2public static mixed __callStatic ( string $name , array $arguments )3 4__call() is triggered when invoking inaccessible methods in an object context.5 6__callStatic() is triggered when invoking inaccessible methods in a static context.

  __call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。对这个翻译简单的做下评论:放屁!评论完了。

  看看官网的中文翻译:当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。

  这个翻译还算准确,不过有点小漏洞:全局范围内用className::方式调用的时候,也会触发__callStatic。比较好的翻译:在对象上下文中调用不可访问方法,__call会触发。在静态上下文中调用不可访问方法,__callStatic会被触发。

  实际上决定调用哪个魔术方法取决于上下文环境(context)而不是要调用什么。实际上一个方法不可见,就无法判断是否静态,我哪知道要调用什么?所以我对第一个翻译的评论是比较合理的。对于某人说继承类中::语义不明,实际上有继承关系类中::属于类的内部访问,这里::既不是静态也不表示非静态,而仅仅起到一个范围解析的作用(相关内容可阅读PHP文档)。具体要触发哪一个魔术方法,根据上下文环境来确定。

  了解到两个魔术方法之后,你是否感觉这跟重载一点边都不沾?不要这么想,这只是和类C语言中的重载长得不像而已,本质是一样的。当触发某个魔术方法的时候,PHP会自动传递 $name , $arguments两个参数,第一个是函数名称,第二个是参数列表。如果两个函数名称相同而参数列表不同,可以将不同的参数类型解析出来进行不同的处理,完美的实现了类C语言重载的功能。具体怎么解析string和array我就不讲了。甚至还可以拿参数列表为基准,对不同的函数名称进行处理。或者进行参数与函数名的任意组合。可见PHP的重载功能完全的包含了类C语言的重载,并且实现更为强大而灵活的功能。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 任性付冻结了怎么办 任性贷风险提示怎么办 保修发票没了怎么办 家电发票丢了怎么办 天猫苏宁发票丢了怎么办 本子密码忘记了怎么办 直属领导抢客户怎么办 老板油烟机坏了怎么办 闲鱼上买洗衣机自提怎么办 水龙头水流太小怎么办 水龙头压力太小怎么办 浴室水龙头水小怎么办 冰箱出水口堵了怎么办 水龙头出水太小怎么办 买东西让骗了怎么办 医疗保险中断5年怎么办 医保断交5年怎么办 医保社保断了怎么办 医保没交够25年怎么办 医保卡外借 保险怎么办 安装系统时断电怎么办 电视不带wifi怎么办 苹果手机呼叫失败怎么办 苹果8呼叫失败怎么办 微信被朋友拉黑怎么办 手机骚扰电话太多怎么办 骚扰电话太多了怎么办 总是接到骚扰电话怎么办 老有骚扰电话怎么办 一直被电话轰炸怎么办 有线电视突然出来雪花怎么办 电视出雪花了怎么办 长虹电视有雪花怎么办 网络电视雪花了怎么办 夏普电视雪花屏怎么办 有线电视显示无信号怎么办 门铃对讲机坏了怎么办 蝴蝶兰叶子晒伤怎么办 杜鹃花浇水多了怎么办 杜鹃花施肥多了怎么办 杜鹃花根变黑了怎么办