php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

1、面向对象 封装继承多态  接口、重载、抽象类、最终类

面向对象 封装继承多态 

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

[面向对象]
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();

抽象类、抽象方法、重载、接口

抽象类

定义:一个抽象的不能被实例化的类。

定义形式(abstract关键字):

abstract class 类名{

// ...

}

抽象方法

定义:一个只有方法头,没有方法体的方法

定义形式(用abstract修饰方法)

abstract class 类名{

abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略

}

抽象类和抽象方法的细节:

一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;

抽象类中可以没有抽象方法;

子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。

重载

含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如java)。

如:

class A{

function f(){

}

function f($a){

}

function f($a,$b){

}

}

php中的重载

含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。

属性重载:

含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)

属性,本质就是一个变量,其有4个操作:

取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__get();

赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__set();

判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__isset();

判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__unset()。

__set($属性名,值):

含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。

 这个方法结合__get()方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:

class A{

protected $prop_list = array();

function __set($p,$v){

$this->prop_list[$p] = $v;

}

function __get($p){

return $this->prop_list[$p];

}

}

__isset()

含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。

__unset()

含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。

方法重载

当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的__call()这个魔术方法;

当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的__callstatic()这个魔术方法。

php中实现通常的面向对象语言的“方法重载”(利用__call()和__callstatic()方法),如:

<?php
class A{
    function __call($methodName,$arguments){
        switch ($methodName)         {
            case ‘f1‘: // 调用了f1这个不存在的方法
                # 调用了方法名为f1的这一系列重载方法
                if(count($arguments) == 0){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 1){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 2){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 3){
                    // 这里拿这些参数做这个方法的事情...
                }
                // ...
                break;
            case ‘f2‘: // 调用了f2这个不存在的方法
                # 调用了方法名为f2的这一系列重载方法
                if(count($arguments) == 0){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 1){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 2){
                    // 这里拿这些参数做这个方法的事情...
                }else if(count($arguments) == 3){
                    // 这里拿这些参数做这个方法的事情...
                }
                // ...
                break;
            default:
                break;
        }
    }
}
?>

接口

定义形式

interface 接口名{

常量1;

常量2;

...

抽象方法1;

抽象方法2;

...

}

说明:

接口中只有常量(接口常量)和抽象方法两种成员;

接口常量的使用形式为:接口名称::常量名称;

接口中的抽象方法,不要使用abstract修饰,也需要使用访问控制修饰符,因为其天然就是Public;

php中接口和类一样也可以继承(接口继承接口)。

还谈php和java面向对象

相同点:

抽象类和抽象方法,及它们之间的细节都一样;

php的接口和java的接口都一样。

不同点:

重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。

最终类final class:

在定义一个类的时候,在class关键字前面使用final关键,则表示该类“不可继承”(禁止继承);

如下:

final class 类名{

  //类成员定义。。

}

最终方法

就是在方法定义的前面,使用关键字final,表示该方法“不可覆盖”——禁止覆盖。

抽象类
定义:一个抽象的不能被实例化的类。定义形式(abstract关键字):
abstract class 类名{    // ...}123抽象方法
定义:一个只有方法头,没有方法体的方法
定义形式(用abstract修饰方法)
abstract class 类名{    abstract function 方法名(形参列表); // 没有方法体,结尾分号不能省略}123抽象类和抽象方法的细节:
一个抽象方法必须在抽象类中,即方法为抽象的,那么其所在的类也不是是抽象的;抽象类中可以没有抽象方法;子类继承了父类,那么要么实现(“重写”)父类的抽象方法,要么在次定义为抽象的。重载
含义:在“通常面向对象语言”中是指一个类可以名字相同但形参不同的方法的现象(如java)。
如:

class A{
  function f(){}
  function f($a){}
   function f($a,$b){}}1234567891011php中的重载

含义:是指当对一个对象或类使用其未定义的属性或方法的时候,其中的一些“处理机制”。
属性重载:
含义:对一个对象的不存在的属性进行使用的时候,这个类种预先设定好的应对方法(处理机制)属性,本质就是一个变量,其有4个操作:
取值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__get();赋值:当对一个对象的不存在的属性进行“取值”的时候,就会自动调用方法:__set();判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__isset();判断(isset):当对一个对象的不存在的属性进行“判断”的时候,就会自动调用方法:__unset()。__set($属性名,值):
含义:当对一个对象的不存在属性进行“赋值”的时候就会自动调用这个内部的魔术方法,它有两个形参,分别代表对不存在的属性进行赋值的时候的“属性名”和“属性值”。
 这个方法结合__get()方法,往往可以使我们定义的类,就有一种“可简便扩展属性”的特性,即类(或对象)的属性,可以更为方便自由,如下所示:
class A{    protected $prop_list = array();    function __set($p,$v){        $this->prop_list[$p] = $v;    }    function __get($p){        return $this->prop_list[$p];    }}123456789__isset()
含义:当对一个对象的不存在属性进行“判断”的时候就会自动调用这个内部的魔术方法。__unset()
含义:当对一个对象的不存在属性进行“销毁”的时候就会自动调用这个内部的魔术方法。方法重载
当对一个对象的不存在的实例方法进行“调用”的时候会自动调用类中的__call()这个魔术方法;
当对一个对象的不存在的静态方法进行“调用”的时候会自动调用类中的__callstatic()这个魔术方法。
php中实现通常的面向对象语言的“方法重载”(利用__call()和__callstatic()方法),如:

<?php
class A{
    function __call($methodName,$arguments)    {            switch ($methodName) {            case ‘f1‘:       // 调用了f1这个不存在的方法                      // 调用了方法名为f1的这一系列重载方法                      if(count($arguments) == 0){                          // 这里拿这些参数做这个方法的事情...                      }else if(count($arguments) == 1){                          // 这里拿这些参数做这个方法的事情...                      }else if(count($arguments) == 2){                          // 这里拿这些参数做这个方法的事情...                      }else if(count($arguments) == 3){                          // 这里拿这些参数做这个方法的事情...                      }                   // ...                    break;              case ‘f2‘:    // 调用了f2这个不存在的方法                    # 调用了方法名为f2的这一系列重载方法                  if(count($arguments) == 0){          // 这里拿这些参数做这个方法的事情...                  }else if(count($arguments) == 1){               // 这里拿这些参数做这个方法的事情...                  }else if(count($arguments) == 2){                        // 这里拿这些参数做这个方法的事情...                  }else if(count($arguments) == 3){                      // 这里拿这些参数做这个方法的事情...                  }                // ...                break;            default:                break;        }    }}?>


定义形式
interface 接口名{    常量1;    常量2;    ...    抽象方法1;    抽象方法2;    ...}12345678说明:
接口中只有常量(接口常量)和抽象方法两种成员;接口常量的使用形式为:接口名称::常量名称;接口中的抽象方法,不要使用abstract修饰,也需要使用访问控制修饰符,因为其天然就是Public;php中接口和类一样也可以继承(接口继承接口)。还谈php和java面向对象
相同点:
抽象类和抽象方法,及它们之间的细节都一样;php的接口和java的接口都一样。不同点:
重载不一样,php重载和其他面向对象语言的重载不同,而java和其他面向对对象语言的重载一样。--------------------- 作者:宿罪 来源:CSDN 原文:https://blog.csdn.net/ydxlt/article/details/50667454 版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/dawuge/p/10480593.html

时间: 2024-07-30 13:49:42

php面向对象 封装继承多态 接口、重载、抽象类、最终类总结的相关文章

封装,继承,多态,接口

封装 封装的概述和好处: 是面向对象三大特征之一 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改. 封装原则: 将不需要对外提供的内容都隐藏起来. 把属性隐藏,提供公共方法对其访问. 成员变量private,提供对应的getXxx()/setXxx()方法 好处: 通过方法来控制成员变量的操作,提高了代码的安全性 把代码用方法进行封装,提高了代码的复用性 public class Student { String name; //int age

初识JAVA(【面向对象】:pub/fri/pro/pri、封装/继承/多态、接口/抽象类、静态方法和抽象方法;泛型、垃圾回收机制、反射和RTTI)

JAVA特点: 语法简单,学习容易 功能强大,适合各种应用开发:J2SE/J2ME/J2EE 面向对象,易扩展,易维护 容错机制好,在内存不够时仍能不崩溃.不死机 强大的网络应用功能 跨平台:JVM,字节码 两个命令: javac helloworld.java:将Java文件编译为字节码的.class文件 java helloworld:运行Java程序...??暂时这么认为 数据类型: 普通数据类型:int a=3; 对象数据类型:使用关键字new,String s=new String("

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象的三大特性---封装继承多态

面向对象的三大特性---封装继承多态 首先我们来创建一个控制台程序 新建一个父类Person 创建一个子类继承父类Person 子类: main函数: 输出结果: 根据结果显示创建子对象,首先调用父类的构造函数在调用子类的构造函数. 继承的传递性 例如: A:B,B:C,则A:C ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写  ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ? 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以称为基类或超类,新建的类称为派生类或子类. ? 在Python中实现继承非常简单,在声明类的时候,在类名后面添加一个小括号,就可以完成继承关系.单纯的从代码的层面上来看当两个类具有相同的功能或者特征的时候就可以使用继承.提取一个父类,这个父类中编写者两个类相同的部分,然后两个类分别去继承这个类就可以

面向对象三大特性(封装/继承/多态)

引入:在面向对象思想中,有三大特性,封装  继承  多态. 思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢? 引入:面向对象很重要的思想就是隐藏,即外部不知道类内部是如何实现业务逻辑的,只管调用和使用结果,这个就是面向对象三大特性之一:  封装 1.封装[掌握] 定义:封装,字面意思就是将内容装到某个容器中,并进行密封保存,在面向对象思想中,封装指数据和对数据的操作捆绑到一起,形成 对外界的隐藏,同时对外提供可以操作的接口. 1.数据:即要操作的数据,在

类与对象 面向对象和面向过程对比 面向对象三大特征:封装 继承 多态

 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大象, 第三步, 关门 面向对象:大象, 你进冰箱. 此时主语是大象. 我操纵的是大象. 此时的大象就是对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先?干什么, 后干什么. 基于该思想编写程序就好比在编写一套流水线. 是一种机械 式的编程

封装继承多态到底讲的是什么

封装继承多态到底讲的是什么 封装.继承.多态并不是针对C#语言提出来的,他是一个在面向对象思想下产生的一个概念.所以想要弄明白封装.继承.多态,首先就要先了解面向对象概念. 封装:当我们提及面向对象的时候,这个对象怎么来?就是通过我们人为的封装得来.封装就是把一些特征或功能组合到一个抽象的对象上.就比如说电脑:它的特征是有一个显示屏,有一个主机,有鼠标和键盘等等.功能有计算等.那我们把这些特征和功能组合到“电脑”这个抽象的名词上时,“电脑”于是就有了这些特征和功能.但这个“电脑”不是实物,它代表

三大特性:封装,继承,多态

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是:封装,继承,多态 所谓封装: 也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体.在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问.通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对