zoukankan      html  css  js  c++  java
  • PHP面向对象之多态

    面向对象三大特性

    • 特性
      • 封装
      • 继承
      • 多态

    多态

    • 多态分为两种:方法重写和方法重载

    方法重写

    • 子类重写了父类的同名的方法
      • 子类的方法必须和父类的方法同名
      • 参数个数要一致
      • 子类修饰的不能比父类更加严格
    <?php
    class A{
      protected function say($name){
        echo $name,',狗!<br/>';
      }
      protected function says($name){
        echo $name,',狗!<br/>';
      }
    }
    class B extends A{
      public function say($name){
        echo $name,',猫!<br/>';
      }
    }
    $per= new B();
    $per->say('Sunny');
    $per->says('Sunny');
    ?>
    

    方法重载

    • 方法重载
      • 在同一个类中,有多个同名的函数,通过参数的不同来区分不同的方法
      • PHP不支持方法重载,但是PHP可以通过其他方法来模拟方法重载
    # 利用魔术方法模拟方法重载
    <?php
    class Math {
    	public function __call($fn_name,$fn_args) {
    		$sum=0;
    		foreach($fn_args as $v) {
    			$sum+=$v;
    		}
    		echo implode(',',$fn_args).'的和是:'.$sum,'<br>';
    	}
    }
    $math=new Math();
    $math->call(10,20);
    $math->call(10,20,30);
    $math->call(10,20,30,40);
    ?>
    
    <?php 
    class Overloader { 
      private $properties= array(); 
      function __get($property_name){ 
        if(isset($this->properties[$property_name])){ 
          return($this->properties[$property_name]); 
        }else{ 
          return(NULL); 
        } 
      } 
      function __set($property_name, $value){ 
        $this->properties[$property_name]= $value; 
      } 
      public function __call($method, $p){ 
        print("Invoking $method()<br>
    "); 
        //print("Arguments: "); 
        //print_r($args); 
        if($method == 'display'){ 
          if(is_object($p[0])) 
            $this->displayObject($p[0]); 
          else if(is_array($p[0])) 
            $this->displayArray($p[0]); 
          else $this->displayScalar($p[0]); 
        } 
      } 
      public function displayObject($p){ 
        echo ("你传入的是个对象,内容如下:<br>"); 
        print_r($p); 
        echo "<hr>"; 
      } 
      public function displayArray($p){ 
        echo ("你传入的是个数组,内容如下:<br>"); 
        print_r($p); 
        echo "<hr>"; 
      } 
      public function displayScalar($p){ 
        echo ("你传入的是个单独变量,内容如下:<br>" . $p); 
        echo "<hr>"; 
      } 
    } 
    $obj= new Overloader(); 
    //调用 __set() 给一个不存在的属性变量赋值 
    $obj->dynaProp = "Dynamic Content"; 
    //调用 __get() 
    print($obj->dynaProp."<br>
    "); 
    //调用 __call() 
    $obj->dynaMethod("Leon", "Zeev"); 
    // $obj->display(array(1,2,3)); 
    // $obj->display('Cat'); 
    ?> 
    
  • 相关阅读:
    盒子跟随鼠标移动而移动(兼容IE8)
    JavaScript捕获鼠标坐标
    JavaScript判断滚动条是否滚动到底部
    JavaScript自定义getStyle方法获取元素样式
    JavaScript实现简单的图片切换功能
    SpeedReader
    JavaScript定时器
    远程登陆ubantu服务器 .bashrc文件每次打开终端都需要source的问题
    阿里云服务器Ubantu16.04升级python3.6
    阿里云服务器ubantu创建新用户登录显示问题
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14117062.html
Copyright © 2011-2022 走看看