美文网首页
PHP中的重载与接口

PHP中的重载与接口

作者: kangyiii | 来源:发表于2017-03-15 14:24 被阅读0次

    遗留问题:

    资源和对象区别:
    我们目前学习到的资源只有两种:1.$link=mysql_connect("localhost","root","123");得到一个"连接MySQL数据库"的资源。2.$result=mysql_query("select...");结果集资源,资源变量可以理解为php代码之外的已经有的"对象"。
    PHP对象是通过PHP代码创建出来的。

    重载

    一个类中,有多个同名方法,每个方法的参数不同。这种情况叫做重载。参数不同可以是:数量个数、参数类型、排列顺序不同。PHP能够变相实现重载:

    1. 属性重载:使用一个不存在的属性,会自动调用类中预先定义好的某个方法以处理数据。
    2. 方法重载:使用一个不存在的方法,会自动调用类中预先定义好的某个方法以处理该行为。
    属性重载

    属性重载使用环境:

    1. 取值:$v1 = 对象->属性;
    2. 赋值:对象->属性=XX值;
    3. 判断是否存在:isset(对象->属性)
    4. 销毁:unset(对象->属性)
      如果某属性不存在,但使用以上语法,处理过程:
    5. 取值:自动调用类中的__get();
    6. 赋值:自动调用类中的__set();
    7. 判断是否存在:自动调用类中的__isset();
    8. 销毁:自动调用类中的__unset();
    <?php
            class A{
                public $p1 = 1;
                public $propArr = array();//用数组来存储"不存在的属性值"
                function __get($prop_name){
                    if(isset($this->propArr[$prop_name])){
                        return $this->propArr[$prop_name];
                    }
                    return "不存在属性$prop_name";
                }
                function __set($prop_name,$value){
                    $this->propArr[$prop_name] = $value;
                }
            }
            $o2 = new A();
            $o2->p2=2;
            echo "<br/>o1的p2属性为:".$o2->p2;
            $s1 = isset($o2->p1);
            $s2 = isset($o2->p2);
            $s3 = isset($o2->p4);
            echo "<br/>";
            var_dump($s1,$s2,$s3);
            unset($o2->p2);
            $s4 = isset($o2->p2);
            echo "<br/>";
            var_dump($s4);
            ?>
    //o1的p2属性为:2
    //bool(true) bool(true) bool(false)
    //bool(false) 
    
    方法重载

    调用一个类对象中不存在的方法:自动调用__call()
    变相实现了其他变相对象中的重载形式

    <?php
        function f1(){
            echo "<br/>f1函数被执行(任务完成)";
        }
        function f2(x,y){
            echo "<br/>f1函数被执行(任务完成)";
            return x+y;
        }
        class A{
            function __call($name,$array){
                    $count = count($array);
                    if($count==0){
                        f1();
                    }else if($count==2){
                        return f2($array[0],$array[1]);     
                }
            }
        }   
        $o1 = new A();
        $o1->f1();
        $v1 = $o1->f1(1,2);
        echo "<br/>v1结果=".$v1;  
        ?>
    

    调用一个类中没有的静态方法:自动调用__staticCall(),变相实现重载的形式和调用普通方法类似(利用魔术方法__get()、set()、__isset()、__unset()等)

    接口

    接口可以看做是比抽象类更高层面的"规范",不考虑接口常量的话,功能就是规范下级类的实现方法,但接口可以实现"多继承",也就是说一个类可以实现多个接口,而类不能多继承。所以有接口后,在规范下级类将变得更加灵活。接口中只有两类最简单的特性信息,接口常量、抽象方法

    1. 接口常量:在接口中的常量
    2. 抽象方法:需要实现接口的类实现它,无须声明abstract,但也是抽象方法
        <?php
            //飞这个动作的接口
            interface flyAnimal{
                function fly(){
    
                }
            }
            //鸟类(弗雷)
            class bird{
                public $wings = "2";
    
            }
            //麻雀会飞也是鸟类,继承父类、实现接口
            class maque extends bird implements flyAnimal{
                function fly(){
                    echo "<br/>煽动{$this->wings}个翅膀";
                }
            }
            clase tuoniao extends bird{
                 public function run(){
                    echo "<br/>煽动{$this->wings}个翅膀,跑啊跑";
                 }
            }
            $m1 = new maque();
            $m1->fly();
            $t1 = new tuoniao();
            $t1->run();
        ?>
    

    注意:

    1. 一个类只能集成一个父类,但可以继承多个接口
    class 类名A extends 类名B implements 接口1,接口2...{...}
    
    1. 一个接口同样可以继承另一个接口(单继承)
    interface 接口1 extends 接口2{···}
    

    相关文章

      网友评论

          本文标题:PHP中的重载与接口

          本文链接:https://www.haomeiwen.com/subject/cibhnttx.html