php面向对象程序设计61条准则解析

合集下载

php面向对象知识点

php面向对象知识点

php面向对象知识点PHP是一种广泛使用的服务器端脚本语言,它可以用来开发动态网站和 Web 应用程序。

在现代的 Web 开发中,面向对象编程已经成为了一种必不可少的技能,因此熟练掌握 PHP 面向对象编程知识点也是 Web 开发者必须具备的技能之一。

本文将围绕“PHP面向对象知识点”这个话题,从以下几个方面进行阐述。

一、类和对象在 PHP 中,类是一种用户自定义的数据类型,而对象则是类的实例。

类可以定义属性和方法,其中属性用于存储对象的信息,方法用于操作对象的状态。

创建类的语法格式如下:```class ClassName{// 属性和方法声明}```二、类的继承类的继承是一种常见的面向对象编程概念,它允许新创建的类继承已有类的属性和方法。

在 PHP 中,使用关键字 extends 来实现类的继承。

例如:```class ParentClass{public $name;public function introduce(){echo "My name is ".$this->name;}}class ChildClass extends ParentClass{public function say(){echo "Hello.";}}$childObj=new ChildClass();$childObj->name="Lily";$childObj->introduce(); // My name is Lily$childObj->say(); // Hello.```三、访问控制符在类中,访问控制符用于限制属性和方法的访问权限,它有三种类型:public、protected 和 private。

其中,public 表示公共的,任何人均可访问;protected 表示受保护的,只有类和其子类中才可以访问;private 表示私有的,只有在声明它的类内部才能访问。

PHP 面向对象教程(强力推荐)

PHP 面向对象教程(强力推荐)
LAMP 大讲堂 PHP 面向对象技术(全面讲解)
LAMP 大讲堂
PHP 面向对象技术(全面讲解)
作者:高洛峰
本部分一共包括以下一些技术点: 1.面向对象的概念 2.什么是类,什么是对象,类和对象之间的关系 3.什么是面向对象编程呢? 4.如何抽象出一个类? 5.如何实例化对象? 6.如何去使用对象中的成员? 7.特殊的引用“$this”的使用 8.构造方法与析构方法 9.封装性 10.__set()、 __get()、 __isset()、 __unset()四个方法的应用 11.类的继承 12.多态的应用 13.重载新的方法 14.访问类型 15.静态成员的使用 16.final 关键字的应用 17.__toString()方法 18.克隆对象 19.__call 处理调用错误 20.自动加载类 21.把对象串行化 22.抽象方法和抽象类 23.php5 接口技术
3.什么是面向对象编程呢?
就不说他的概念,如果你想建立一个电脑教室,首先要有一个房间, 房间里面要有 N 台电脑, 有 N 张桌子, N 把椅子, 白板, 投影机等等,这些是什么,刚才咱们说了,这就是对象,能看 到的一个个的实体,可以说这个电脑教室的单位就是这一个个的实体对象, 它们共同组成了这个 电脑教室,那么我们是做程序,这和面向对象有什么关系呢?开发一个系统程序和建一个电脑教室 类似,你把每个独立的功能模块抽象成类,形成对象,由多个对象组成这个系统,这些对象之间都 能够接收信息、处理数据和向其它对象发送信息等等相互作用。就构成了面向对象的程序。
类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是 类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。
上面大概就是它们的定义吧,也许你是刚接触面向对象的朋友, 不要被概念的东西搞晕了,给 你举个例子吧,如果你去中关村想买几台组装的 PC 机,到了那里你第一步要干什么,是不是装机 的工程师和你坐在一起,按你提供的信息和你一起完成一个装机的配置单呀,这个配置单就可以想 象成是类,它就是一张纸,但是它上面记录了你要买的 PC 机的信息,如果用这个配置单买 10 台机 器,那么这 10 台机子,都是按这个配置单组成的,所以说这 10 台机子是一个类型的,也可以说是 一类的。那么什么是对象呢,类的实例化结果就是对象,用这个配置单配置出来(实例化出来)的 机子就是对象,是我们可以操作的实体,10 台机子,10 个对象。每台机子都是独立的,只能说明 他们是同一类的,对其中一个机做任何动作都不会影响其它 9 台机器,但是我对类修改,也就是在 这个配置单上加一个或少一个配件,那么装出来的 9 个机子都改变了,这是类和对象的关系(类的 实例化结果就是对象)。

面向对象设计的三大原则,理解并能举例

面向对象设计的三大原则,理解并能举例

面向对象设计的三大原则,理解并能举例
面向对象编程设计有三大原则,分别是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

1. 封装(Encapsulation):封装是将数据和相关行为(方法)
组合在一个类中,以实现隐藏内部实现细节的原则。

通过封装,可以将一组数据和对它们的操作封装在一个类中,对外部只暴露必要的接口,隐藏了实现的细节,提高了代码的安全性和可维护性。

例如,一个汽车类可以封装了颜色、品牌、速度等变量和加速、刹车等方法,对外只提供加速和刹车的接口,而隐藏了内部细节。

2. 继承(Inheritance):继承是指创建一个新类(子类)从已
有的类(父类)中继承属性和方法的过程。

子类可以通过继承父类的特性来扩展和增强功能,并且可以重用已有的代码。

例如,有一个动物类,定义了一些公共属性和方法,然后创建了狗类和猫类继承动物类,狗类和猫类就可以共享动物类的一些功能,同时可以根据需要添加自己的特定功能。

3. 多态(Polymorphism):多态是指同一类对象在不同情况下
可以表现出不同的行为。

对象多态性使用继承和接口实现,通过动态绑定和方法重写,允许不同的对象对同一个方法做出不同的响应。

例如,一个动物类中有一个叫声的方法,猫类和狗类都继承了动物类,并重写了叫声的方法,当通过调用叫声方法时,猫和狗的叫声不同,实现了多态性。

这三个原则是面向对象设计的基石,有助于实现代码的可重用性、可扩展性和灵活性。

面向对象程序设计之设计原则与方法

面向对象程序设计之设计原则与方法

面向对象程序设计之设计原则与方法面向对象程序设计是一种先进的程序设计范式,关键在于建立一个具有自主行为和自我描述能力的程序体系结构,它可以非常自然的模拟现实世界中的对象和关系,提升程序的可读性、可扩展性和可维护性,其重要性不言而喻。

在面向对象的程序设计中,设计原则和设计方法是非常重要的,以下是我对其的理解和分析。

一、设计原则设计原则是设计过程中最重要的指导方针。

它可以帮助开发人员做出更好的设计决策,确保程序具有高内聚性和低耦合性,以此提高程序的可扩展性、可维护性和可重用性。

下面是一些常用的面向对象设计原则:1. 单一职责原则(Single Responsibility Principle,SRP)单一职责原则是指一个类、模块或者函数只负责一项任务。

这样做可以降低类的复杂度,提高代码的可读性,方便代码的维护和修改。

2. 开放-封闭原则(Open-Closed Principle,OCP)开放-封闭原则是指一个软件实体(类、模块或函数等)应该对扩展开放,对修改关闭。

也就是说,在不修改现有代码的情况下,可以通过增加新的代码来扩展软件的功能。

3. 里氏替换原则(Liskov Substitution Principle,LSP)里氏替换原则是指如果一个软件实体使用了另一个软件实体,那么它们应该是可以互换的。

也就是说,子类可以替换父类出现在程序中的任何地方,并保证程序的功能正确性。

4. 依赖倒置原则(Dependency Inversion Principle,DIP)依赖倒置原则是指高层模块不应该依赖低层模块,二者都应该依赖抽象。

同时,抽象不应该依赖细节,细节应该依赖抽象。

这样做可以降低模块之间的耦合度,提高代码的可维护性和可重用性。

5. 接口隔离原则(Interface Segregation Principle,ISP)接口隔离原则是指一个类不应该依赖一个它不需要的接口。

也就是说,一个接口应该只提供它的客户端需要的方法,而不应该强迫它们实现它们不需要的方法。

php面向对象程序设计(OOP)的61条准则

php面向对象程序设计(OOP)的61条准则
一个类用到的其他类的数目应当尽量少。
(23)尽量减少类和协作者之间传递的消息的数量。
(24)尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。
(25)尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。
(26)如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。也即:包含关系总是意味着使用关系。
(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。
(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。
当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。
(29)让系统功能在窄而深的继承体系中垂直分布。
(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。
朝着稳定的方向进行依赖.
(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。
(12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。
(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。
(41)所有的抽象类都应当是基类。
(42)所有的基类都应当是抽象类。
(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。
(44)如果两个或更多个类共享公共数据(但没有公共行为),那么应当把公共数据放在一个类中,每个共享这个数据的类都包含这个类。
(45)如果两个或更多个类有共同的数据和行为(就是方法),那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。

面向对象设计六大原则

面向对象设计六大原则

面向对象设计六大原则面向对象设计的原则是面向对象思想的提炼,它比面向对象思想的核心要素更具可操作性,但与设计模式相比,却又更加的抽象,是设计精神要义的抽象概括。

形象地将,面向对象思想像法理的精神,设计原则则相对于基本宪法,而设计模式就好比各式各样的具体法律条文了。

面向对象设计原则有6个:开放封闭原则,单一职责原则,依赖倒置原则,Liskov替换原则,迪米特法则和接口隔离原则或合成/聚合复用原则(不同资料略有不同,这里对7个都做了整理)。

1单一职责原则(Single Responsibility Principle SRP)There should never be more than one reason for a class to change. 什么意思呢?所谓单一职责原则就是一个类只负责一个职责,只有一个引起变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化会削弱或抑制这个类完成其他职责的能力,这个耦合会导致脆弱的设计。

软件设计真正要做的许多内容,就是发现职责并把这些职责相互分离;如果能够想到多于一个动机去改变一个类,那么这个类就具有多于一个职责,就应该考虑类的分离。

以调制解调器为例如下图:从上述类图里面我们发现有四个方法Dial(拨通电话),Hangup(挂电话),Receive(收到信息),Send(发送信息),经过分析不难判断出,实际上Dial(拨通电话)和Hangup(挂电话)是属于连接的范畴,而Receive(收到信息)和Send(发送信息)是属于数据传送的范畴。

这里类包括两个职责,显然违反了SRP。

这样做有潜在的隐患,如果要改变连接的方式,势必要修改Modem,而修改Modem 类的结果导致凡事依赖Modem类可能都需要修改,这样就需要重新编译和部署,不管数据传输这部分是否需要修改。

因此要重构Modem类,从中抽象出两个接口,一个专门负责连接,另一个专门负责数据传送。

《面向对象程序设计》知识点

《面向对象程序设计》知识点

《面向对象程序设计》知识点《面向对象程序设计》是计算机科学中的重要概念,它是一种软件开发方法,将软件模型作为一个系统的集合来设计、分析和实现。

本文将重点介绍面向对象程序设计中的关键知识点,包括面向对象的基本概念、类与对象、继承与多态、封装和抽象等内容,以便读者全面了解和掌握面向对象程序设计的核心概念和方法。

一、面向对象的基本概念1. 面向对象编程的起源:面向对象编程(Object-Oriented Programming,简称OOP)起源于20世纪60年代,是一种基于对象的软件开发范式,它将数据和操作数据的方法组合到一个对象中,以及通过对象之间的交互来完成程序的设计。

2. 面向对象的特征:面向对象的程序设计具有封装、继承和多态的特征。

封装指的是将数据和处理数据的方法封装在对象中,继承指的是子类可以继承父类的属性和方法,多态指的是同一操作作用于不同对象上时可以有不同的行为。

3. 面向对象的优势:面向对象的程序设计具有代码复用性高、可维护性强、扩展性好、可靠性高等优势,可以提高程序的设计效率和质量。

二、类与对象1. 类的定义:类是一种抽象数据类型,用来描述具有相同属性和行为的对象的集合。

类用来创建对象的模板,包含数据成员和成员函数。

2. 对象的创建:对象是类的一个实例,是具体的数据和行为的封装体。

通过类实例化,可以创建多个对象来表示真实世界的实体。

3. 类的成员:类包含数据成员和成员函数。

数据成员表示对象的属性,成员函数表示对象的行为,可以进行数据的操作和处理。

三、继承与多态1. 继承:继承是指一个新类从现有类中派生出来,并且拥有现有类的属性和行为。

继承可以实现代码的复用,并且可以建立类之间的关系。

2. 多态:多态是指同一操作作用于不同对象上时可以有不同的行为。

多态通过虚函数和动态绑定实现,可以使程序具有更好的灵活性和扩展性。

四、封装和抽象1. 封装:封装是指将数据和数据的操作封装在类的内部,外部无法直接访问和修改类的数据。

面向对象六大基本原则的理解

面向对象六大基本原则的理解

⾯向对象六⼤基本原则的理解在学习设计模式的时候,总是被推荐先学习⼀下⾯向对象的六⼤原则,学习后果然受益匪浅。

以下完全是我对六⼤基本原则的理解,和官⽹解释可能有出路,⽽且我更多是站在设计模式的⾓度,⽽不是⾯向对象的⾓度理解,如果有什么错误,敬亲谅解。

1.开闭原则很多教程都把开闭原则作为这六⼤原则中最基本的原则,也就是说他是各个原则的核⼼。

开闭原则指的是,⼀个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

⾄于这个具体怎么理解,我也看了很多教程,有些教程说当我们遇到新的需求,就需要我们对我们模块继承的形式进⾏扩展,⽽不是修改代码。

这样的解释貌似有道理,但是如果真的这样做了,程序结构只会更加复杂,业务逻辑只会更不清晰,完全是⼀种作死的做法。

当业务发⽣改变的时候,肯定是要修改代码的,不需要的东西留着只会让程序臃肿,让维护者搞不清什么是有⽤的代码,什么是已经过时的代码。

我不太相信开闭原则的真谛是让我们⾛向这样⼀个死胡同。

对于开闭原则,我的理解是,我们在设计软件的时候,⾸先要搞清楚程序当中什么是未来可能变化的,什么是未来不会变化的。

对于可能变化的东西,我们要提前给与可以对应的扩展接⼝。

当然实际开发中,即便是我们认为这些不会变化的地⽅,未来还是可能变化的,这种变化就只能改代码了,但是这种修改仅仅只是改变个别细节,整体架构往往不会变化。

⽽对于可能变化的地⽅,我们要给出可以⾜够扩展的空间,让其能够⾃由扩展,基本发⽣了重⼤的需求变更,整体架构也不会受影响。

例如:⼯⼚模式中,我们将创建对象的过程封装了起来,这样创建对象对的过程中,创建的代码就和调⽤的代码尽可能地解除了耦合。

创建过程可能是变化的,⽽调⽤过程往往是不变的。

我们创建⼀个对象之后,需要为其初始化,设定⼀些配置,这个过程需要我们给出可以扩展的余地,⽽且要求扩展的时候不能影响调⽤部分,所以需要使⽤⼯⼚模式,将可变的创建过程封装起来,供不变的调⽤模块。

这样说来,开闭原则的核⼼是解耦了?没错,我认为开闭原则讲的就是解构,但是他要求我们在设计的时候,重点要预判出什么地⽅是会发⽣变化的,并要为变化的地⽅留出余地。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

php面向对象程序设计(OOP)的61条准则,掌握了以下准则你必然就是一个php强人.
(1)所有数据都应该隐藏在所在的类的内部。

(2)类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。

(3)尽量减少类的协议中的消息。

(4)实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。

(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。

如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。

(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。

(7)类之间应该零耦合,或者只有导出耦合关系。

也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。

(8)类应该只表示一个关键抽象。

包中的所有类对于同一类性质的变化应该是共同封闭的。

一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响.
(9)把相关的数据和行为集中放置。

设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。

这种类型的行为暗示着这条经验原则被违反了。

(10)把不相关的信息放在另一个类中(也即:互不沟通的行为)。

朝着稳定的方向进行依赖.
(11)确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

(12)在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。

(13)在你的系统中不要创建全能类/对象。

对名字包含Driver、Manager、System、Susystem 的类要特别多加小心。

规划一个接口而不是实现一个接口。

(14)对公共接口中定义了大量访问方法的类多加小心。

大量访问方法意味着相关数据和行为没有集中存放。

(15)对包含太多互不沟通的行为的类多加小心。

这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。

(16)在由同用户界面交互的面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。

(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。

(18)从你的设计中去除不需要的类。

一般来说,我们会把这个类降级成一个属性。

(19)去除系统外的类。

系统外的类的特点是,抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。

(20)不要把操作变成类。

质疑任何名字是动词或者派生自动词的类,特别是只有一个有意义行为的类。

考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。

(21)我们在创建应用程序的分析模型时常常引入代理类。

在设计阶段,我们常会发现很
多代理没有用的,应当去除。

(22)尽量减少类的协作者的数量。

一个类用到的其他类的数目应当尽量少。

(23)尽量减少类和协作者之间传递的消息的数量。

(24)尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。

(25)尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。

(26)如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。

也即:包含关系总是意味着使用关系。

(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。

(28)类包含的对象数目不应当超过开发者短期记忆的容量。

这个数目常常是6。

当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。

(29)让系统功能在窄而深的继承体系中垂直分布。

(30)在实现语义约束时,最好根据类定义来实现。

这常常会导致类泛滥成灾,在这种情况下,约束应当在类的行为中实现,通常是在构造函数中实现,但不是必须如此。

(31)在类的构造函数中实现语义约束时,把约束测试放在构造函数领域所允许的尽量深的包含层次中。

(32)约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。

(33)约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。

(34)类必须知道它包含什么,但是不能知道谁包含它。

(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。

(36)继承只应被用来为特化层次结构建模。

(37)派生类必须知道基类,基类不应该知道关于它们的派生类的任何信息。

(38)基类中的所有数据都应当是私有的,不要使用保护数据。

类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。

(39)在理论上,继承层次体系应当深一点,越深越好。

(40)在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。

一个广为接受的深度值是6。

(41)所有的抽象类都应当是基类。

(42)所有的基类都应当是抽象类。

(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。

(44)如果两个或更多个类共享公共数据(但没有公共行为),那么应当把公共数据放在一个类中,每个共享这个数据的类都包含这个类。

(45)如果两个或更多个类有共同的数据和行为(就是方法),那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。

(46)如果两个或更多个类共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共基类继承。

(47)对对象类型的显示的分情况分析一般是错误的。

在大多数这样的情况下,设计者应当使用多态。

(48)对属性值的显示的分情况分析常常是错误的。

类应当解耦合成一个继承层次结构,每个属性值都被变换成一个派生类。

(49)不要通过继承关系来为类的动态语义建模。

试图用静态语义关系来为动态语义建模会导致在运行时切换类型。

(50)不要把类的对象变成派生类。

对任何只有一个实例的派生类都要多加小心。

(51)如果你觉得需要在运行时刻创建新的类,那么退后一步以认清你要创建的是对象。

现在,把这些对象概括成一个类。

(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。

(53)不要把可选包含同对继承的需要相混淆。

把可选包含建模成继承会带来泛滥成灾的类。

(54)在创建继承层次时,试着创建可复用的框架,而不是可复用的组件。

(55)如果你在设计中使用了多重继承,先假设你犯了错误。

如果没犯错误,你需要设法证明。

(56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承的那个东西的一个特殊类型?(2)基类是不是派生类的一部分?
(57)如果你在一个面向对象设计中发现了多重继承关系,确保没有哪个基类实际上是另一个基类的派生类。

(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择,请选择包含关系。

(59)不要把全局数据或全局函数用于类的对象的薄记工作。

应当使用类变量或类方法。

(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。

但是,在对逻辑设计作出决策的过程中我们经常用到物理设计准则。

(61)不要绕开公共接口去修改对象的状态。

相关文档
最新文档