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();
时间: 2024-11-17 07:09:48

PHP面向对象详解:继承、封装与多态的相关文章

Java面向对象详解

Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵懵懂懂,后来实践的多了,有些东西才慢慢清 楚:二是经过一定的实践之后,反过头来再去学习一些基础东西才能够理解的更透彻:三是有些东西基础但是确很重要,是值得好好搞一搞的. 1.面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),

面向对象详解

在程序的大世界里,我们可以把编程的方法分为两类,面向对象和面向过程(做一下归类),首先说一下面向过程,我们就拿c语言的面向过程来说一下,面向过程主要是算法+数据结构,面向过程是以计算机的行为习惯去考虑问题,所以学习C语言.学习面向过程要花费的时间和精力是相当的多的,但是如果你是做底层开发就要好的功底,但是如果是学习面向对象就完全不一样了,面向对象是以人的思维习惯分析.解决问题,所谓“众生皆平等.万物皆对象”,块如果我们把一下项目中的各个功能模块看成一个对象,然后一个对象有相应的属性的行为,也就是

python面向对象详解(上)

创建类 Python 类使用 class 关键字来创建.简单的类的声明可以是关键字后紧跟类名: class ClassName(bases): 'class documentation string' #'类文档字符串' class_suite #类体 实例化 通过类名后跟一对圆括号实例化一个类 mc = MyClass() # instantiate class 初始化类 'int()'构造器 def __int__(self): pass 注意:self类似Java的this关键字作用,它代

Python面向对象详解

Python面向对象的"怜人之处" Python的待客之道--谁能进来 Python的封装--只给你想要的 Python的继承--到处认干爹 Python的多态--说是就是

[Objective-C] 004_继承封装与多态

继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的新类称为"子类"或"派生类",被继承的类称为"基类"."父类"或"超类".继承的过程,就是从一般到特殊的过程.在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是"属于"关系.例如

面向对象三大特性之封装与多态

一 .封装 最主要的作用:隐藏对象的属性和实现细节,仅对外提供公共访问方式 封装原则 将不需要对外提供的内容都隐藏起来 把属性都隐藏,提供公共方法对其访问 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N def __init__(self):

php面向对象详解

面向对象 对象概念是面向对象技术的核心.在显示世界里我们所面对的事情都是对象,如计算机.电视机.自行车等.在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象. 对象的主要三个特性 对象的行为:可以对 面向对象 对象概念是面向对象技术的核心.在显示世界里我们所面对的事情都是对象,如计算机.电视机.自行车等.在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象. 对象的主要三个特性对象的行为:可以对 对象施加那些操

JavaScript面向对象详解

一.认识面向对象 1.面向对象中的概念: (1)一切事物皆对象 (2)对象具有封装和继承特性 (3)信息隐藏 二.JS面向对象 (function(){ var n = "yelven2" function Person(name){ var _this = {} _this._name = name; _this.sayHello = function(){ alert("PHello"+_this._name+n); } return _this; } wind

javascript的面向对象详解

每次说到javascript到面向对象,总感觉自己心里懂,但是却不知道该怎么说,这就是似懂非懂到表现,于是乎,每次一说,就要到处去查找资料,零零碎碎到看了一些,感觉有懂了,但是过段时间,好像又不知道是怎么回事了,于是乎,又到处找资料,然道是我本来就缺对象?才不理解对象是啥,以至于现实中找找对象,javascript中也在找对象!哎,好尴尬啊!直到我看到了一个妹纸写到“不可不知的javascript面向对象”,我才明白面向对象是什么,这是不是说我要找到对象就是这个妹纸呢??,先记录一下备忘吧,下面