PHP基础之 重载 的实现方式

===================PHP中的伪重载Overloading==================
PHP中没有像C#或java中的重载,但可以通其它方法实现重载
重载:属性重载与方法重载

属性重载:
    __set($proName,$val)给变量设值、__get($proName)给变量赋值
    在PHP5.1以后有__isset($proName)检查变量是否存在、_unset($proName)释放变量
    给私有的或未定义的类的变量取值和赋值时,会自动调用__get()和_set()方法

方法的重载:
[不能通过多个构造函数或多个方法名相同的方法来实现重载]
方法一:通过‘魔术方法’:__call($methodName,$prams) 、__callStatic($methodName,$prams)来实现方法的重载[参数只能值传递]
方法二:通过判断参数个数和类型来实现重载


当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。[PHP5.3手册]
当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。[PHP5.3手册]

 

<?php
class Overloading
{
    private $oName;
    private $oCount;

    //使用__set()来约束所有的私有属性
    public function __set($proName,$val)
    {
        if($proName=="oName"){
            $this->oName=$val;
        }elseif ($proName=="oCount") {
            if($val>0)
            {
                $this->oCount=$val;
            }else
            {
                echo "赋值失败,必须大于0\n";
            }
        }
    }

    //使用__get()来获取的私有属性
    public function __get($proName)
    {
        if(isset($proName))
        {
            return $this->proName;
        }
        else
        {
            return null;
        }
    }
    
    //外部在调用未定义的静态方法时,被自动调用
    public static function __callStatic($methodName,$prams)
    {
        if($methodName=="Sum")
        {

            echo "静态方法:'$methodName' 被调用了,参数:". implode(', ', $prams). "\n";
        }
    }

    //外部在调用未定义的方法时,被自动调用
    public function __call($method,$prams)
    {
        if($method=="JiSuan")
        {
            if(count($prams)==2&&is_int($prams[0])){
              return $this->JiSuan1($prams[0],$prams[1]);
            }
            elseif (count($prams)==3) {
              return $this->JiSuan2($prams[0],$prams[1],$prams[2]);
            }
        }
    }


    public function JiSuan1($n1,$n2)
    {
        return $n1+$n2;
    }

    public function JiSuan2($n1,$n2,$n3)
    {
        return $n1*$n2*$n3;
    }

    //通过判断参数个数和类型is_int()/is_array()来实现重载
    public function Compute()
    {
        $args = func_get_args();
        switch (func_num_args()) {
            case 2:
                return $this->JiSuan1($args[0],$args[1]);
            case 3:
                return $this->JiSuan2($args[0],$args[1],$args[2]);
        }
    }

}

$o1 = new Overloading();

echo $o1->oName="小强"."\n";
echo ($o1->oCount=2)."\n";
echo ($o1->oCount=-1)."\n\n";//因为赋值失败,返回值为-1

//调用未定义的实例方法(通过_call()内部来判断方法名和参数个数和类型实现方法重载)
echo "两个数的和:".$o1->JiSuan(55,5)."\n";
echo "三个数的积:".$o1->JiSuan(5,5,5)."\n\n";

//调用未定义的静态方法(通过_callStatic()内部来判断方法名和参数个数和类型实现静态方法的重载)
Overloading::Sum(3,2,1);

//调用公共方法(内部判断参数 实现重载)
echo "两个数的和:".$o1->Compute(5,6)."\n";
echo "三个数的积:".$o1->Compute(2,2,2)."\n\n";


/*
输出结果:
小强
2
赋值失败,必须大于0
-1

两个数的和:60
三个数的积:125

静态方法:'Sum' 被调用了,参数:3, 2, 1
两个数的和:11
三个数的积:8
*/

转载于:https://www.cnblogs.com/lt-style/p/3498633.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值