zoukankan      html  css  js  c++  java
  • php 面向对象三大特点:封装、继承、多态

    在讲解这三大特性前,我们先讲访问修饰符。

    php中有3中访问修饰符:public protected private;

    public:表示公有的;可在本类、子类、对象实例中访问。

    protected:表示受保护的;可在本类、子类中访问;不能在对象实例中访问。

    private:表示私有的;可在本类中访问;不能在子类、对象实例中访问。

    一、封装性

    封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作。

    复制代码
    class Student{
        public $name;
        protected $age;
        private $play;
        public function __construct($name, $age){
            echo '我是Student类';
            $this->name = $name;
            $this->age = $age;
        }
    }
    
    $student = new Student('moon', 18);
    复制代码

    二、继承性

    当多个类有很多共同属性和方法时,代码冗余;这时,我们可以将共有部分提取出来,封装成一个类;子类经过一些操作可以使用这个共有的父类,这个就叫继承。

    语法结构: 

    class 父类名{} 

    class 子类名 extends 父类名{}

    继承要素:

    • 一个子类只能继承一个父类(这里指直接继承);如果希望继承多个类的属性和方法,可以使用多层继承
    • 在子类中调用父类的构造方法 父类::__construct() 或者 parent::__construct()
    • 如果子类和父类的方法名相同(public,protected),我们称为方法覆盖或方法重写(override),看下面的多态性 
    复制代码
    class Student{
        public $name;
        protected $age;
        private $play;
        public function __construct($name, $age){
            echo '我是Student类';
            $this->name = $name;
            $this->age = $age;
        }
    }
    
    // Pupil类继承Student类
    class Pupil extends Student {
        public function testing(){
            echo '我是Pupil';
        }
        public function __construct($name, $age){
            parent::__construct($name, $age);   // 调用父类的构造方法1
            // Student::__construct($name, $age);   // 调用父类的构造方法2
            echo $this->name;
            echo $this->age;
            // echo $this->play;    // 报错,父类private定义的属性不能被子类继承
        }
    }
    
    new Pupil('sky', 18);
    
    
    // 实现类的多层继承
    class A{
        public $name='AAA';
    }
    class B extends A{
        public $age=30;
    }
    class C extends B{}
    $p = new C();
    echo $p->name; // 这里会输出AAA 
    复制代码

    三、多态性

    • 子类覆盖父类的方法(重写),必须要求父类、子类的方法名和参数个数完全一致 
    • 子类调用父类的方法(protected/public),使用 父类名::方法名 或者 parent::方法名 
    • 在实现方法重写的时候,访问修饰符可以不一样,但是子类方法的访问权限必须大于等于父类方法的访问权限 
    复制代码
    class Student{
        public $name;
        protected $age;
        private $play;
        public function getPlay(){
            echo '我是Student';
        }
    }
    
    // Pupil类继承Student类
    class Pupil extends Student {
        public function __construct(){
            parent::getPlay(); // 可以这样调用父类的方法
        }
    
        public function getPlay(){
            echo '我是Pupil';
        }
    }
    
    $p1 = new Pupil();  // 我是Student
    $p1->getPlay();     // 我是Pupil
    复制代码

    扩展: 

    方法重载(overload) 

    基本概念:函数名相同,但参数的个数或参数的类型不同,达到调用同一个函数,可以区分不同的函数 

    在PHP5中虽然也支持重载,但是和其它语言还是有很大区别的,php中不能定义多个同名函数 

    PHP5中提供了强大的“魔术”函数,使用这些魔术函数,我们可以做到函数重载

    这里我们要到到 __call,当一个对象调一个方法时,而该方法不存在,则程序会自动调用__call 

  • 相关阅读:
    前端之JavaScript内容
    前端之CSS内容
    前端之HTML内容
    表单提交中的input、button、submit的区别
    PostgreSQL
    PostgreSQL
    PostgreSQL
    JIRA中的标记语言的语法参考
    Markdown
    Linux
  • 原文地址:https://www.cnblogs.com/lyzaidxh/p/12772118.html
Copyright © 2011-2022 走看看