A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2017-12-16 13:31 编辑

PHP类的重载技术(overloading) (下)

今天为大家带来的是类的重载技术(overloading)之方法重载,大家要好好关注啊,这个可是在框架当中应用非常广泛的哟~
方法重载
__call( ) 魔术方法
        当对一个对象调用一个不存在(未定义)的实例方法的时候,就会自动调用该魔术方法;
形式:
       function  __call ($name,  $args ){
              //这里,$name就表示正在调用的那个不存在的方法名;
              //$args表示正在调用的那个不存在的方法时使用的实参数据(可能有多个),它是一个数组!
              ........
       }
[PHP] 纯文本查看 复制代码
<?php
/*黑马程序员济南中心出品*/

class Person{
function __cal($name,$args){
if($name == "eat"){
$v1 = $args[0]; //获得第一个实参数据
echo "<br />正在优雅的吃".$v1;
}else if($name == "drink"){
$v1 = $args[0];//获得第一个实参数据
echo "<br />正在悠闲的喝".$v1;
}else if($name == "big_eat"){
$v1 = $args[0];//获得第一个实参数据
$v2 = $args[1];
$v3 = $args[2];
echo "<br />正在使用{$v2}和{$v3}豪放的大吃".$v1;
}
}
}

$p1 = new Person();
$p1->eat("饭");
$p1->drink("饮料");
$p1->big_eat("牛排","刀","叉");


得到结果:

正在优雅的吃饭
正在悠闲的喝饮料
正在使用刀和叉豪放的大吃 牛排

一个应用:

       使用php中的重载技术,实现常规面向对象语言中的方法的重载效果:
[PHP] 纯文本查看 复制代码
<?php[/align]/*黑马程序员济南中心出品*/

class Jisuanqi{
    function __call($name,$args){
        if($name == "jisuan"){
            $len = count($args);//实参的个数
            if($len == 1){
                $v1 = $args[0];//取得一个
                return -$v1;//取相反值后返回
            }else if($len == 2){
                $v1 = $args[0];
                $v2 = $args[1];
                $re = $v1*$v1 + $v2 * $v2;
                return $re;
            }else if($len == 3){
                $v1 = $args[0];
                $v2 = $args[1];
                $v3 = $args[2];
                //pow()函数返回 x 的 y 次方。
                $re = pow($v1,3) + pow($v2,3) + pow($v3,3);
                return $re;
            }else{
                 //创建用户级别的错误消息,并提示错误信息
                trigger_error("参数无效",E_USER_ERROR);
            }
        }else{
            //创建用户级别的错误消息,并提示错误信息
            trigger_error("该方法未定义,不允许使用!",E_USER_ERROR);
        }
    }
}

$obj1 = new Jisuanqi();
$v1 = $obj1->jisuan(1);
$v2 = $obj1->jisuan(2,3);
$v3 = $obj1->jisuan(2,3,4);
var_dump($v1,$v2,$v3);
$v4 = $obj1->jisuan();
$v5 = $obj1->f1();



结果为:

int(-1)
int(13)
int(99)
Fatal error : 参数无效!

__callstatic ( ) 魔术方法
       当对一个类使用其不存在(未定义)的静态方法的时候,就会自动调用该静态方法;
       其基本原理跟__call()是一样的,只是这是一个静态方法,适用于类调用未定义的静态方法的情形;
形式:
       static  function  __callstatic ($name,  $args ){
              //这里,$name就表示正在调用的那个不存在的方法名;
              //$args表示正在调用的那个不存在的方法时使用的实参数据(可能有多个),它是一个数组!
              ........
         }
[PHP] 纯文本查看 复制代码
<?php
/*黑马程序员济南中心出品*/
class A{
    static function __callstatic($name,$args){
        echo "正在调用一个不存在的静态方法:$name";
        echo "其实参数据为:";
        print_r($args);
    }
}
A::f1(1);
[align=left]A::f2(1,2);
结果为:
正在调用一个不存在的静态方法:f1
其实参数据为:array([0]=>1)


正在调用一个不存在的静态方法:f2
其实参数据为:array([0]=>1 [1]=>2)

不知道大家对今天讲的类的重载技术之方法重载学习的怎么样啊?有什么疑问欢迎来黑马程序员济南中心来咨询哟~
点进这个帖子的同学肯定是要奋发图强,学技术拿高薪的有志青年,这里我看你骨骼惊奇,是个绝世的练武奇才,你我有缘,今天我就把这个武林秘籍如来神掌传授于你! 什么?不想学如来神掌?不要紧!这里有各个门派的武林绝学,链接拿好!!哈哈哈哈




1 个回复

倒序浏览
鲁哥出品,必属精品
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马