• 技术文章 >后端开发 >php教程

    php面向对象的特征是什么?PHP面向对象特征的介绍(代码)

    不言不言2018-07-24 16:19:01原创1208
    这里所说的PHP面向对象,准确的说应该叫做PHP面向对象编程,php面向对象编程的三个基本特征分别为封装、继承和多态,下面我们就来分别看看PHP面向对象的三大特征。

    一、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 零基础入门教程

    谈谈我对php中面向对象的理解

    以上就是php面向对象的特征是什么?PHP面向对象特征的介绍(代码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php m
    上一篇:PHP文件操作函数有哪些?php常用文件操作函数的总结(附代码) 下一篇:php的构造函数是什么?php构造函数的用法介绍(实例)

    相关文章推荐

    • 记录:php rsa加密处理失败的解决方法• [PHP+ImageMagick]将PDF转成图片(步骤详解)• PHP 9 大缓存技术总结,php大缓存总结_PHP教程• MySQL手册版本 5.0.20-MySQL同步(二)_PHP教程• ApacheReferenceManual10_PHP教程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网