zoukankan      html  css  js  c++  java
  • 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
    */
  • 相关阅读:
    HDU 4069 Squiggly Sudoku
    SPOJ 1771 Yet Another NQueen Problem
    POJ 3469 Dual Core CPU
    CF 118E Bertown roads
    URAL 1664 Pipeline Transportation
    POJ 3076 Sudoku
    UVA 10330 Power Transmission
    HDU 1426 Sudoku Killer
    POJ 3074 Sudoku
    HDU 3315 My Brute
  • 原文地址:https://www.cnblogs.com/lt-style/p/3498633.html
Copyright © 2011-2022 走看看