美文网首页php 相关
php面向对象三大特征封装、多态、继承

php面向对象三大特征封装、多态、继承

作者: zhanglizzy | 来源:发表于2017-03-25 23:56 被阅读1036次

    一、php面向对象的三大特征:
    1、封装:
    封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。

    访问控制符赋值取值.png

    2、继承:
    所谓继承,就是一个子类通过extends 父类 把父类的一些(public / protected)属性和(public / protected)方法继承下来。不能继承私有的。

      作用:增加代码复用性,管理代码成本低。
     
      基本语法:
      class 类名 extends 父类名 {
            //需要的非私有属性和方法
      }
    
    继承.png
    <?php
        
        //父类
        Class Student {
            public $name;
            protected $age;
            protected $grade;
    
            // public __construct() {
    
            // }
    
            public function showInfo() {
                echo $this -> name."<br/>".$this -> age;
            }
        }
    
        /**
        * 小学生
        */
        class Pupil extends Student
        {
            public function test() {
                echo "<br/>小学生在考试。。。";
            }
        }
    
        /**
        * 大学生
        */
        class Graduate extends Student
        {
            public function test() {
                echo "<br/>大学生在考试。。。";
            } 
        }
    
        $stu1 = new Pupil();
        $stu1 -> name = "lizzy";
        $stu1 -> test();
        $stu1 -> showInfo();
    
        $stu2 = new Graduate();
        $stu2 -> name = "zxm";
        $stu2 -> test();
        $stu2 -> showInfo();
    ?>
    

    注意:
    (1)protected属性和方法受保护,在子类不能直接调用,要在子类中定义方法访问。

    Class ParentClass {
        public $name = 'lizzy';
        protected $age = 24;
        private $sex = "女";
    
        public function test1() {
            echo "<br/>展示public方法";
        }
    
        protected function test2() {
            echo "<br/>展示protected方法";
        }
    
        private function test3() {
            echo "<br/>展示private方法";
        }
    }
    
    Class SubClass extends ParentClass {
        function show() {
            echo "age=".$this->age;
            // echo "sex=".$this->sex;//是不能继承下来的
            $this -> test2();
        }
    }
    
    $sub1 = new SubClass();
    $sub1 -> show();
    $sub1 -> test1();
    

    (2)如果希望子类调用父类的构造方法,或者其他方法(public / protected),可以使用类名::方法名; 或者parent::方法名;

    Class A {
        public $n1=90;
    
        public function __construct() {
            echo "A的构造方法";
        }
    }
    
    Class B extends A {
        function __construct() {
            echo "B的构造方法";
            //调用父类的两种方法
            // A::__construct();
            parent::__construct();
        }
    }
    $b = new B(); 
    

    (3)当一个子类的方法和父类方法(protected/public)完全一致时,我们称之为方法的覆盖(重写)。

    3、多态:
    “重载”是类的多态的一种表现;
    重载的概念:函数名一样,通过函数的参数个数或者参数类型不同,达到调用同一个函数名,但是可以区分不同的函数。

    魔法函数__call,但不推荐使用; 它一个对象调用某个方法,而该方法不存在,则系统会自动调用__call。

    <?php
    
        Class A {
    
            public function test1($p) {
                echo "接收一个参数<br/>";
            }
    
            public function test2($p) {
                echo "接收两个参数<br/>";
            }
    
            //提供__call 它一个对象调用某个方法,而该方法不存在,则系统会自动调用__call
            function __call($method,$p) {
                if ($method == "test") {
                    if (count($p) == 1) {
                        $this -> test1($p);
                    } elseif (count($p) == 2) {
                        $this -> test2($p);
                    }
                }
            }
        }
    
        $a = new A();
        $a -> test(1);
        $a -> test(21,43)
    ?>
    

    常见魔法常量:两个下划线LINE两个下划线;当前多少行;
    两个下划线FILE两个下划线;当前文件的绝对路径;

    方法的重写/覆盖(override):
    1、当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法究竟如何写,可以让子类去覆盖这个方法。
    使用如下:

    <?php
    
        Class Animal {
            function cry() {
                echo "不知道怎么叫";
            }
        }
    
        //重写
        Class Dog extends Animal {
            function cry() {
                echo "小狗汪汪叫";
            }
        }
    
        //重写
        Class Pig extends Animal {
            function cry() {
                echo "小猪哼哼叫";
            }
        }
    
        $dog = new Dog();
        $dog -> cry();
        $pig = new Pig();
        $pig -> cry();
    
    ?>
    

    方法重写的细节:
    1、重写子类的函数名和参数个数必须和父类的一致;但不要求参数的名称一样。
    2、如果子类要去调用父类的某个方法(public / protected)可以使用parent::方法名(); 或者父类名::方法名(); 可根据情况是否传参。
    3、实现方法覆盖时,访问修饰符可以不一样,但是必须满足子类的访问范围>=父类的访问范围。

    多态体现的地方:
    当子类没有覆盖父类的方法,则子类调用的是父类,当子类覆盖了父类的方法则调用的是自己的方法。

    相关文章

      网友评论

        本文标题:php面向对象三大特征封装、多态、继承

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