• 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
    ";
                }
            }
        }
    
        //使用__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). "
    ";
            }
        }
    
        //外部在调用未定义的方法时,被自动调用
        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="小强"."
    ";
    echo ($o1->oCount=2)."
    ";
    echo ($o1->oCount=-1)."
    
    ";//因为赋值失败,返回值为-1
    
    //调用未定义的实例方法(通过_call()内部来判断方法名和参数个数和类型实现方法重载)
    echo "两个数的和:".$o1->JiSuan(55,5)."
    ";
    echo "三个数的积:".$o1->JiSuan(5,5,5)."
    
    ";
    
    //调用未定义的静态方法(通过_callStatic()内部来判断方法名和参数个数和类型实现静态方法的重载)
    Overloading::Sum(3,2,1);
    
    //调用公共方法(内部判断参数 实现重载)
    echo "两个数的和:".$o1->Compute(5,6)."
    ";
    echo "三个数的积:".$o1->Compute(2,2,2)."
    
    ";
    
    
    /*
    输出结果:
    小强
    2
    赋值失败,必须大于0
    -1
    
    两个数的和:60
    三个数的积:125
    
    静态方法:'Sum' 被调用了,参数:3, 2, 1
    两个数的和:11
    三个数的积:8
    */
  • 相关阅读:
    java 日期格式 毫秒 表示方法
    Java的框架是什么意思
    圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)
    预装win8的笔记本如何重装win7
    Word 2013 无法撤销操作的错误
    面试经验分享(跳槽季~~~❀)
    一些可能有点用处的C#开发经验
    电子设计解决方案透视
    突破限速
    当区块链遇上Rust
  • 原文地址:https://www.cnblogs.com/lt-style/p/3498633.html
Copyright © 2020-2023  润新知