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

    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 星期三   分类:好文分享   浏览(31359)
    本文地址:https://www.blogs.hk/post-2959.html   [百度已收录]
    声明:本页信息由网友自行发布或来源于网络,真实性、合法性由发布人负责,请仔细甄别!本站只为传递信息,我们不做任何双方证明,也不承担任何法律责任。文章内容若侵犯你的权益,请联系本站删除!
    版权所有:《博客之家
    文章标题:《PHP 中的方法 “重载”
    除非注明,文章均为 《博客之家》 原创
    转载请注明本文短网址:https://www.blogs.hk/post-2959.html  [生成短网址]

    留言咨询

    自动获取QQ

    昵称

    邮箱

    网址

        站点统计

        • 收录网址:3370 个
        • 发布文章:3008 条
        • 在线人数:1人
        • 总访问量:270552492次
        • 本站运行:12年5月3天
        Copyright © 2025 博客之家 版权所有  
        關於本站免責聲明sitemap新站登錄