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'); 
    ?> 
    
  • 相关阅读:
    线程进程之间的关系
    socket网络编程
    Docker在github上的站点
    大型网站架构体系的演变
    centos7 安装SSH
    如何在CentOS 7中禁用IPv6
    在 Docker 上运行一个 RESTful 风格的微服务
    docker 操作命令详解
    玩转Docker镜像
    搭建自己的 Docker 私有仓库服务
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14117062.html
Copyright © 2011-2022 走看看