我不生产轮子,我只是轮子的搬运工:PHP 面向对象 | 菜鸟教程
面向对象的编程入门教程推荐上方链接。本文仅就Php面向对象的函数重载作介绍。话不多说先来一段代码和控制台输出结果。含注释。稍后会作详细讲解。建议自己先仿照下放代码写一遍,结合注释适当理解,再看后文讲解。
<?php
/**
* Created by PhpStorm.
* User: funco
* Date: 17-6-9
* Time: 下午1:39
*/
class MulStat
{
// showClass 可以接受0个参数
private function showClass() {
echo "this is class ".__CLASS__;
}
// showString 可以接受一个参数
private function showString($str) {
echo "string is ".$str;
}
// __call方法 可以获取实例化对象调用的成员函数名和向该被调函数传递的参数个数
public function __call($name, $args) {
// 先判断要调用的函数名$name
if($name == "showInfo"){
// 然后可以根据参数($args)数量判断调用哪个成员函数
switch(count($args)) { // count可以计算数组元素个数
case 0:
$this->showClass();break;
case 1:
$this->showString($args[0]);break;
}// switch
}// if
}
}
//实例化MulStat类
$mulStat = new MulStat();
echo "\$mulStat->showInfo(\"funco 小风\"):\n";
$mulStat->showInfo("funco 小风");
// 两次换行 便于观察结果
echo "\n\n";
echo "\$mulStat->showInfo():\n";
$mulStat->showInfo();
控制台输出结果如下
第一行和最后一行非程序输出,为IDE自动输出
首先我们需要知道,__call方法是php的一个魔术方法,关于__call的详细介绍可以参考我的博文:php深入学习二——魔术方法以及__call的调用
如上方代码实际运行过程如下
1. 实例化类MulStat,并令$mulStat作为其实例化对象的引用
2. 调用$mulStat的成员方法showInfo并传递一个参数"funco 小风"字符串。
3. showInfo命名且含一个参数的命名方式的成员函数不存在,且__call被正确定义
4. 将该函数名称showInfo作为字符串传递给__call的第一个参数(这里是$name),将传递的参数列表(这里是["funco 小风"])作为参数传递给__call的第二个参数(这里是$args)
5. 判断函数名(这里即判断$name是否等于"showInfo")
6. 判断参数个数并调用相应希望调用的函数(这里即为switch语句部分的工作)
之后调用showInfo()的过程类似上方的2-6步。可以自行尝试推导
总结:综上所述,php本身不支持多态,但是我们通过借助__call方法实现类似多态即函数重载的功能。需要注意的是,只有被调用的函数不存在时__call才会被调用,至于更复杂的函数重载的实现,读者可以自己尝试,万变不离其宗。