当前位置:首页 » 好文分享 » 详情

PHP 中的方法 “重载”

第一次接触到重载,是在看 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 的“重载”是指动态地“创建”方法。
打赏
X
打赏方式:
  • 支付宝
  • 微信
  • QQ红包

打开支付宝扫一扫
日期:2017年12月13日 21:33:28 星期三   分类:好文分享   浏览(30233)
本文地址:https://www.blogs.hk/post-2959.html   [百度已收录]
声明:本页信息由网友自行发布或来源于网络,真实性、合法性由发布人负责,请仔细甄别!本站只为传递信息,我们不做任何双方证明,也不承担任何法律责任。文章内容若侵犯你的权益,请联系本站删除!

留言咨询

自动获取QQ

昵称

邮箱

网址

      Copyright © 2024 博客之家 版权所有  
      關於本站免責聲明sitemap新站登錄