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
    */
  • 相关阅读:
    ubuntu 下 apt-get update 错误
    'unable to run mksdcard sdk tool" when instll android studio on ubuntu14.10以后版本
    ubuntu下安装sougou
    ubuntu下安装jdk1.8.0_91
    ubuntu update时出现错误
    android studio中R文件变红并报错
    git使用
    Android新手须知
    css初级之框模型
    css初级之边框
  • 原文地址:https://www.cnblogs.com/lt-style/p/3498633.html
Copyright © 2011-2022 走看看