分享

PHP教程(16)类常量访问+魔术方法+常量+单例模式+面向对象三大特点(封装+继承+多态)

 知识书馆 2022-07-17 发布于广东

回顾

面向对象编程:类,对象和实例化

类成员:属性,方法和类常量,访问修饰限定符(publicprotectedprivate

对象访问属性和方法:对象->属性/方法(实参列表);

内部访问:$this,代表当前进入到类内部的对象

魔术方法:构造方法和析构方法

对象传值,对象比较


面向对象

类的加载

因为要得到一个类的对象,必须先保证类结构已经在内存中(代码段)。

自动加载

在需要用到类的时候,系统会根据指定好的路径去找对应的类文件(文件名为基础),然后根据用户指定的操作,对文件进行处理(加载)。

魔术函数:会自动被调用的函数

__autoload():自动加载函数,所有的自动(魔术)都是提供了一个机制,能够被系统自动调用,但是内部的结构都是用户自己定义。

自动加载通常的处理方式

自动加载是PHP对于类的加载的一种处理机制(小系统),专门负责加载文件。

1.      实例化的第一步:先去代码段中查看对应的类是否存在

2.      如果不存在,系统会查看是否开启了自动加载机制(__autoload

3.      如果有自动加载存在,那么系统就会调用自动加载函数,传入参数:类名

注意:自动加载的使用前提,是类文件与类之间的关系特别清楚(完全相同),而且对应的类文件名字,必须有规则(类名.class.php

类常量的访问           

类常量属于类,而不属于对象。对象是不能访问。

常量的访问必须通过类来实现:

类名::常量名,::叫做范围解析操作符

因为在类的内部经常性的使用类来访问类中的成员,所在类的内部使用类进行访问的时候,有一个类似$this代表对象的关键字:self自己的意思,代表当前类名(self不能单独打印输出,self必须结合范围解析操作符)

常量的内存分布

self$this的区别

1.      self代表类,$this代表对象

2.      self访问类内部的常量和静态属性和静态方法,$this访问对象的属性和普通方法

3.      self必须配合范围解析操作符(::)才能生效,$this代表对象,对象本来就是一种数据类型,所以$this可以单独被打印。

4.      能用$this的地方,一定可以使用self,但是能使用self的地方不一定可以使用$this

类常量,静态属性和静态方法的内部访问使用self

普通方法,属性的内部访问使用$this

静态

静态分为两个部分:静态属性和静态方法

静态的东西都是给类用的(包括类常量),非静态的都是给对象用的

静态属性

在定义属性的时候,使用关键字static修饰的属性称之为静态属性。

静态属性属于类不属于对象。

对象统计器:统计当前类被实例化了多少个对象。

静态方法

使用static关键字修饰的方法叫做静态方法。(静态方法原则上是给类用的)

能用静态解决的问题,不用普通方法解决问题(静态的东西可以直接使用类访问,不需要通过对象实例化,因此节省了内存空间,提升了效率)。

对象访问静态方法(可以)

静态方法和非静态方法的区别

静态方法里面不能使用$this关键字。

特别注意:

1.      在写代码的过程中,严格遵循大小写规范

2.      严格遵循:静态的内容给类访问,非静态的是给对象访问,不要跨界操作

魔术方法

对象是一种复合数据类型,不能直接使用echo进行输出操作。

__tostring():指的是当对象需要被转换成字符串的时候,会自动调用的方法

对象默认的是引用传递,所以导致对象的产生只能是new才能产生,但是有时候需要通过对象来产生对象,这时候需要应用到一个克隆的技术。

语法:变量 = clone 对象变量:

魔术方法:__clone(),克隆对象的时候,被克隆出来的对象会去调用的方法。

魔术常量

__CLASS__:代表当前类名,只能类的内部使用

设计模式

1.      什么是设计模式?

指的是一种已经成熟话的设计规范,通过这种规范,能够达到某种指定的要实现的效果。

php中,只有简单的设计模式:单例模式,工厂模式

单例模式

1.      什么是单例模式?

单例模式,只有一个实例(对象),一个类只能产生一个对象。

要实现单例模式,必须解决以下问题

1.      确定有哪些方式可以产生新的对象:newclone,必须禁用这两种方法:私有化构造方法和克隆方法

2.      如何在封闭了外部产生对象的途径之后,进入到内部产生?解决方案:静态方法,可以不需要在外部创建对象的前提下,可以进入到类的内部。

3.      如何在内的内部要得到对象?解决方案:在静态方法中可以创建对象

问题:该静态方法可以被多次调用,因此会产生多个对象

4.      解决方案:增加一个静态属性用来保存生成的对象,如果后面再次新增对象的话,得先判断对象是否存在,存在就不创建。

效果

对象判断方式:instanceof,判断一个对象是否属于某个类

总结:单例模式要实现:三私一公(私有化构造方法,私有化克隆方法,私有化静态属性,公有化的静态方法)

工厂模式

1.      什么工厂模式?

类似工厂一样,需要什么类的对象,就产生对应类的对象。

工厂模式要实现:能够生产对象,能够加载类。

PHP是一种既支持面向过程又支持面向对象的语言。不是所有的面向对象语言都有类的概念,如js。(可以忽略)

面向对象三大特点

面向对象的三大特点:封装,继承和多态

封装

封装:面向将数据(属性)以及对数据的操作(方法)捆绑到一起,形成对外的数据隐藏。只对外提供可以调用的接口供其使用。(public的方法和属性)

封装的过程称之为抽象:将具有相同特性的一类事务,把公共的内容抽离出来,形成文字描述的过程。

继承

继承:子辈拥有父辈的财富(属性)或者工作(方法)

如果一个类已经定义好可以使用的方法和属性了,但是有一个类想在该类的基础上进行扩展。扩展类就可以从已有的类继承,将已有的属性和方法都直接应用,而不用自己再去定义。

继承的优点

1.      便于扩展(子类可以在父类的基础上增加自己的特点)

2.      节省代码:提高代码的复用性

父类

class Father{

         //财富(属性)money

         //工作(方法):makeMoney();

}

子类:继承

class Son extends Father{

         //没有自己工作,继承父亲的工作:makeMoney()

}

多态

多态:多种形态,在存在继承的情况下,子类必须重写父类的方法(子类拥有与父类同名的方法)

父类

class Father{

         function makeMoney(){

      //种树

}

}

子类:继承自父类

class Son extends Father{

         function makeMoney(){

      //卖菜

}

}

//模拟Java

Father father = new Son();

father.makeMoney(); //卖菜

PHP继承

继承:子类可以使用父类的属性和方法。

继承语法

父类:拥有一些可以被继承的属性和方法

子类:想拥有自己不存在但是在别的类中存在的属性和方法

关键字:extends

子类extends 父类

继承属性的访问(类内):公有的和受保护的都可以

继承属性的访问(类外):只有公有的可以

继承内容

继承中不讲静态的继承,php中的继承是子类对象继承父类的对象。(静态的属性和方法也依然满足继承条件,可以使用)

子类会继承父类的所有的属性(非静态)和非私有的方法(非静态)

protected

受保护的,是一个专门用于继承的关键字(访问修饰限定符),用protected关键字修饰的属性或者方法,可以在子类中直接使用,但是不能在子类的外部使用。

双向继承

继承默认的是子类继承父类,但是其实在父类里面也可以同样的使用子类里面的属性和方法,只要满足(publicprotected),所以认为继承是双向的。

重写

子类拥有与父类同名的属性或者方法,就会覆盖父类的属性或者方法。

属性重写

重写的效果

继承内存分析

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多