• PHP面向对象详解:继承、封装与多态


    首先,在解释面向对象之前先解释下什么是面向对象?

    [面向对象]
    1、什么是类?
     具有相同属性(特征)和方法(行为)的一系列个体的集合,类是一个抽象的概念
    2、什么是对象?
    从类中拿到的具有具体属性值得个体,称为对象,对象是一个具体的个体

    所以,面向对象即我们专注对象来处理问题,通过从一个个具有属性和功能的类中拿到对象来处理问题。

    下面我们再来细说下面向对象的三大特征:继承/封装/多态

    一、继承

    在PHP中我们主要通关Extends关键字来实现继承   ->class Student extends Person{}

    下面是几个比较重要的注意事项:

    ①子类只能继承父类的非私有属性。
    ②子类继承父类后,相当于将父类的属性和方法copy到子类,可以直接使用$this调用该属性;
    ③PHP只能单继承,不支持一个类继承多个类。但是一个类可以进行多层继承(即A继承于B,而C又继承于A,C通过A间接继承了B)

    二、封装

    类实现封装是为了不让外面的类随意的修改一个类的成员变量,所以在定义一个类的成员的时候,我们使用private关键字设置这个成员的访问权限

    只能被这个类的其他成员方法调用,而不能被其他类中的方法调用,即通过本类中提供的方法来访问本类中的私有属性。

    ①所以在该类中我们会提供一个访问私有属性的方法

    ②然后我们一般会定义两个方法来实现对一个变量的操作,即:get()set()方法。

    代码示例如下:

    class Person{
            private $name;
            private $age;
            
            public function __construct($name,$age){
                $this->name = $name;
                $this->age = $age;
            }
            function setAge($age){
                if($age>=0&&$age<=120){
                    $this->age = $age;
                }else{
                    error_log("年龄设置有误!");
                }
            }
            
            function getAge(){
                return $this->age;
            }
            public function say(){
                echo "我叫{$this->name},我今年{$this->age}岁了";
            }
            
            function __get($name){
                switch ($name) {
                    case 'name':
                        return $this ->$name."这是读取时加的文字";                    
                    case 'age':
                        return "0".$this ->$name;
                    default:
                        return $this ->$name;                    
                }
                
            }
            function __set($key,$value){
                
                if($key=="name"){
                    $this->$key = $value."这是设置时加的文字<br>";
                }else{
                    $this->$key = $value;
                }
            }
            function __isset($name){
                return isset($this->$name);
            }
            
            function __unset($name){
                if($name=="age"){
                    return;
                }
                 unset($this->$name);
            }
        }
     
    $zhangsan = new Person("zhangsan",14);
    $zhangsan->setAge(12);
    echo $zhangsan->getAge()."<br>";
    var_dump(isset($zhangsan->name));
    unset($zhangsan->age);
    echo $zhangsan->age;

    三、多态

    什么是多态?

    一个类,被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。(同一个类的不同子类表现出不同的形态)

    那么我们如何来实现多态呢?

    子类继承父类 ->子类重写父类方法 ->父类引用指向子类对象

    abstract class Person{        注:父类使用abstract关键字修饰
    abstract function say();
    }

    class Chinese extends Person{    注:子类重写父类方法
    function say(){
    echo "我是中国人<br>";
    }
    }
    class English extends Person{    注:子类重写父类方法
    function say(){
    echo "我是英国人";
    }
    }

    $zhangsan = new Chinese();
    $zhangsan->say();
    $z = new English();
    $z->say();
    Person $p = new Chinese();   注:父类引用指向子类对象

    上述代码中,两个子类都是继承自同一父类,但因为都重写了父类的方法,表现出了不同的形态

     

    * 四、单例设计模式


    单例模式也叫单态模式
    可以保证一个类只能有一个对象实例
    实现要点:
    ①构造函数私有化,不允许使用new关键字创建对象。
    ②对外提供获取对象的方法,在方法中判断对象是否为空,如果为空则创建对象并返回,如果不为空则直接返回
    ③实例对象的属性以及获取对象的方法必须都是静态的。
    ④之后,创建对象只能使用我们提供的静态方法。

    示例代码如下:

    class Singleton{
    static public $Single = null;
    private function __construct(){}
    static function getSingle(){
    if(!self::$Single){
    self::$Single = new Singleton();//self代指类名 new Singleton()和newself()是完全一样的
    }
    
    return self::$Single;
    }
    
    function __destruct(){
    echo "我被销毁了<br>";
    }
    } 
    $s1 = Singleton::getSingle();
    $s1 = Singleton::getSingle();
    $s1 = Singleton::getSingle();
  • 相关阅读:
    js规范
    JS多个函数多个参数如何动态调用,apply的灵活应用
    我是插件狂人,jDuang,jValidator,jModal,jGallery
    Button在IE6、7下的自适应宽度问题解决方法
    100个直接可以拿来用的JavaScript实用功能代码片段
    docker
    jsonp实现post跨域请求
    setInterval倒计时10s
    CI框架源码解读(1)-入口文件index.php
    为什么开始源码阅读
  • 原文地址:https://www.cnblogs.com/adaia/p/6986576.html
Copyright © 2020-2023  润新知