第一次接触到重载,是在看 java 的面向对象的时候,那时候我的内心是,哇,还能这样玩!
重载在 java 的定义:一个类中可以定义多个参数列表不同但名字相同的方法。
class Person
{
public void say()
{
System.out.println("我能说话");
}
public void say(String name)
{
System.out.println("我叫" + name);
}
public void say(String name, int age)
{
System.out.println("我叫" + name + ",今年" + age + "岁");
}
}
Person person = new Person();
person.say(); // 说话
person.say("李明"); // 我叫李明
person.say("李明", 60); // 我叫李明,今年60岁
重载是实现面向对象中多态的一种方式,使得在开发中更加的方便快捷。前两天看一本关于 PHP 面向对象的书的时候,发现 PHP 其实以另外一种方式实现了重载,也就是使用魔术方法 __call 和 __callStatic 。
__call() 方法只有在调用一个不存在或者没有访问权限的方法时才会被调用,__call() 方法第一个参数是被要用的方法名字,第二个参数是一个要传给方法的参数数组。
下面的代码模拟了 java 中根据参数类型进行重载。
class Person {
public function __call($name, $arguments)
{
if ($name == 'say') {
$argNum = count($arguments);
switch ($argNum) {
case 0:
echo '我在说话';
break;
case 1:
echo '我叫' . $arguments[0];
break;
case 2:
echo '我叫' . $arguments[0] . ',今年' . $arguments[1] . '岁';
break;
default:
echo '没有找到方法';
break;
}
}
}
}
$person = new Person();
$person->say();
$person->say('李明');
$person->say('李明', 666);
与 __call() 方法相对应的就是 __callStatic() 方法,__callStatic() 方法是在调用了不存在或者没有访问权限的静态方法时才会被调用。将上面的代码用 __callStatic() 方法实现。
class Person {
public function __call($name, $arguments)
{
if ($name == 'say') {
$argNum = count($arguments);
switch ($argNum) {
case 0:
echo '我在说话';
break;
case 1:
echo '我叫' . $arguments[0];
break;
case 2:
echo '我叫' . $arguments[0] . ',今年' . $arguments[1] . '岁';
break;
default:
echo '没有找到方法';
break;
}
}
}
public static function __callStatic($name, $arguments) {
if ($name == 'say') {
$argNum = count($arguments);
switch ($argNum) {
case 0:
echo '我在说话';
break;
case 1:
echo '我叫' . $arguments[0];
break;
case 2:
echo '我叫' . $arguments[0] . ',今年' . $arguments[1] . '岁';
break;
default:
echo '没有找到方法';
break;
}
}
}
}
Person::say();
Person::say('李明');
Person::say('李明', 666);
可以看到,我用 类名::方法名() 的方式来调用不存在的静态方法,从而实现了静态方法的重载。
说了这么多,最后用一句话来总结 PHP中的重载。
PHP 的“重载”是指动态地“创建”方法。
日期:2017年12月13日 21:33:28 星期三 分类:
好文分享 浏览(30233)
本文地址:https://www.blogs.hk/post-2959.html [
百度已收录]
声明:本页信息由网友自行发布或来源于网络,真实性、合法性由发布人负责,请仔细甄别!本站只为传递信息,我们不做任何双方证明,也不承担任何法律责任。文章内容若侵犯你的权益,请联系本站删除!
留言咨询