PHP面向对象编程的基本概念定义操作属性方法

PHP面向对象
面向对象概念:

1,	世间万物皆对象 (只要有概念的 则都是对象  可见的和不可见的)

对象的基本组成:
1 对象的组成元素

A,	是对象的数据模型 用于描述对象的数据
B,	又被称为对象的属性 或者对象的成员变量

2 对象的行为

A,	是对象的行为模型 用于描述对象能够做什么事情
B,	又被称为对象的方法

对象的特点:

1,	每一个对象都是独一无二的
2,	对象是一个特定事物 他的职能是完成特定的功能
3,	对象是可以重复使用的

面向对象编程的基本概念:
1, 什么是面向对象

a)	面向就是在编程的时候一直把对象放在心上(即用对象来调用数据)

2, 面向对象编程是在编程的时候把数据结构(数据组织方式)都通过对象的结构进行存储
3, 属性,方法
为什么要使用面向对象:

1,	对象的描述方式更加贴合真实的世界 有利于大型业务的理解
2,	在程序设计的过程中用对象的视角分析世界的时候能够拉近程序设计和真实世界的距离

面向对象的实质:

1,	面向对象就是把生活中要解决的问题都用对象的方式进行存储
a)	属性
b)	方法
2,	对象与对象之间通过方法的调用完成互动
a)	方法

面向对象的基本思路:

1,	识别对象
a)	任何实体都可以被识别为一个对象
2,	识别对象的属性
a)	对象里面存储的数据被识别为属性
b)	对于不同的业务逻辑 关注的数据不同 对象里面存储的属性也不同
3,	识别对象的行文
a)	对象自己的属性数据的改变
b)	对象和外部交互

面向对象的基本原则:

1,	对象内部是高内聚的
a)	对象只负责一项特定的职能(职能可大可小)
b)	所有对象相关的内容都封装到对象内部
2,	对象对外是低耦合的
a)	外部世界可以看到对象的一些属性(并非全部)
b)	外部世界可以看到对象可以做某些事件(并非全部)

面向对象的基本实践
类的概念:

1,	物以类聚 把具有相似特性的对象归类到一个类中
2,	类定义了这些相似对象拥有的相同的属性和方法
3,	类是相似对象的描述 称为类的定义 是该类对象的蓝图或者原型
4,	类的对象称为类的一个实例(Instance)
5,	类的属性和方法统称为类成员

列子:
NBA球员就是一个类的定义 (Class Definition)
乔丹 詹姆斯 科比 称为类的实例(Instance)

类的定义案例:

1,	类的实例化 ($obj = new class) 关键词new
2,	对象中的属性成员可以通过->符号访问($obj->name);
构造函数:关键词:__construct(){}
1,	在对象被实例化的时候自动调用
2,	在调用的时候 如果构造方法里面指向了对象的属性 那么在实例化的时候需要把属性参数传递给构造方法 (若不传递构造方法 则有可能会报错)
3,	每一次用new实例化对象的时候 都会有类名后面的参数列表调用构造函数
析构函数:关键词 __destruct(){}
1,	在程序结束的时候自动调用析构函数 
2,	析构函数通常被应用于清理程序中使用的资源 比如程序使用了打印机 那么可以在析构函数里面释放打印机资源
3,	通过把变量设置为NULL 可以触发析构函数的调用

对象引用的概念:

实例化的对象可以赋值给另一个 比如A对象赋值给B 那么我们则拥有了两个对象
对象的引用用于访问对象的属性和方法 A和B 都是对象的引用
A和B是对象的两个独立引用
B是A的影子 使用对象的同一个引用 任何一个赋值为NULL 相当于删除了同一个引用 即是A和B的资源全部被清空(析构)

类的继承概念详解:

基本概念:两个类都有相同的属性和方法 则可以单独拎出来写一个父类
关键词:extends
继承的好处:
1,	父类里面定义的类成员可以不用在子类中重复定义 节约了编程的时间和代价
a)	比如 大家都有名字 都有性别 等等 基础重复的属性以及方法
2,	同一个父类的子类拥有相同的父类定义的类成员 因此外部代码调用他们的时候可以一视同仁
3,	子类可以修改父类定义的类成员(属性,方法等)
a)	称为重写;
b)	一旦子类修改 就按照子类修改之后的功能执行
c)	子类可以调用父类的任何方法以及属性
4,	在php中可以用extends关键词来表示类的继承 后面跟父类的类名 PHP支持单继承 不支持多继承!!!!!

面向对象访问控制:

1,	Public
a)	可以在任何子类父类中访问 以及外部访问
2,	Private
a)	允许子类和父类一起访问
3,	Protected
a)	只允许自己的类访问

面向对象静态成员:
定义:

1,	属性:在访问控制关键字后面添加static 关键字即可
2,	方法:在访问控制关键字后面添加 static关键词即可 
3,	在类定义中 使用静态成员时 用self(或者 static) 关键字后面跟着::操作符即可 注意 在访问静态属性的时候需要在被访问的属性上面加上$符号
4,	在类外边访问 可以不用new对象 直接用类名 class:: 访问 
5,	如果静态属性设置在父类里面 在调用父类的时候要使用 parent::访问
6,	静态方法中 不能使用this关键词访问
7,	静态属性用于保存类的公有数据

子类中编写和父类一样的方法(方法名) 可以完成对父类的重写(overwrite)

面向对象 Final关键字
1,	添加Fina关键字  可以让父类的方法无法被重写
2,	对于不想被任何类继承的类可以在class之前添加final关键字
3,	可以调用父类被final所定义的方法以及属性 但是不可被重写

关键:

1,	用parent关键字 可以访问父类中重写的方法
2,	Self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量 不能用于访问类自身的属性 使用常量的时候不需要在常量名称前面添加$符号 (设置类常量的写法:const关键字 const CHANGLIANG=’常量’)
3,	Static关键字用于访问类自身定义的静态成员 访问静态属性时要在后面加上$符号

对象接口:

定义:就是把不同类的共同行为进行了定义 然后在不同的类里面实现不同的功能	
1,	接口里面所有的方法不需要有方法的实现 也就是说大括号不必要有
2,	接口关键字是interface   列入(interface Class{ public function eat($food)}3,	如果继承了定义接口的类 那么在子继承类里面必须写入接口的名字
4,	接口不能实例化 否则报错
5,	可以用 instanceof关键字来判断某个对象是否实现了某个接口 var_dump($class instanceof Class);
6,	可以用extends来让接口继承接口  当类实现子接口时 父类定义的方法 必须也要在这个类里面进行实现
	类的方法必须有实现  接口的方法必须为空

对象多态:

相同的一行代码 对于传入不同的接口的实现的对象的时候 表现是不同的 这就是多态

对象 抽象类

1,	Abstract 关键字用于定义抽象类 
2,	在抽象方法前面定义abstract关键字可以标明这个方法是抽象方法 不需要具体实现
3,	抽象类中可以包含普通的方法 有方法的具体实现
4,	普通类继承抽象类的关键字是extends
5,	继承抽象类的子类需要实现抽象类中定义的抽象方法 也就是abstract所定义的方法
6,	介于接口和类之间的  可以被继承 也可以在该类中定义一些接口

面向对象的特殊实践(只能在php中实现)

面向对象魔术方法:

	1__tostring() 方法重载
		A,该方法是在当把对象调用为字符串的时候 自动掉用该方法 该方法返回要return  列入:echo $obj;则返回该方法
	2,__invoke 方法重载 会在把对象当做一个方法调用的时候 自动调用 如 new完之后直接 $obj(4); 则自动触发该魔术方法
	3,__call  方法重载  在调用一个不存在普通的方法的时候再进行调用注意:在调用__call时候必须要加参数列入 public function __call($a,$b){}; 如果不加参数则报错(重载)
	4,__callstatic方法重载 这个是在调用一个静态方法不存在的时候 调用该魔术方法注意:在调用__callstatic时候必须要加参数列入 public function __callstatic($a,$b){}; 如果不加参数则报错 (重载)
	5__get() 属性重载 
		A,读取不可访问属性的值时 __get() 会被调用
	6__set() 属性重载
		A,在给不可访问属性赋值时 __set()会被调用
	7__isset() 属性重载
		A,当对不可访问属性调用isset()empty()__isset() 会被调用
	8,  __unset(); 属性重载
		A,	当对不可访问属性调用unset()__unset()会被调用

所谓不可访问属性 实际上就是在调用某个属性时发现这个属性没有被定义 这时候不同的操作就会触发不同的魔术方法
这几个方法也被称为属性重载的魔术方法

9,__clone 方法 想复制一个对象的时候并不想复制一个对象里面的所有属性方法 那么就要用 $obj = clone $obj1 此时操作会把obj的所有属性方法复制  这时候就需要在类里面用__clone 方法来定义 被复制的obj1的所有属性

(以下内容来自 韩亦乐博客 地址:https://www.cnblogs.com/corvoh/p/5747856.html)
面向对象三大特性

面向对象的三大特性是封装,多态,继承 五大原则是 单一职责原则,开放封闭原则,里氏替换原则,依赖倒置原则,接口分离原则,、
	封装:就是把客观事物封装成抽象的类 并且类可以吧自己的数据和方法只让可信的类或者对象操作 对不可信的进行信息隐藏 一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体 在一个对象内部 某些代码或某些数据可是是私有的 不能被外界访问 通过这些方式 对象内部数据提供了不同级别的保护 以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分
	继承:指可以让某个类型的对象获得另一个类型的对象的属性和方法 他支持按级分类的概念 继承指这样的一种能力  他可以使用现有类的所有功能 并在无需重新编写原来分类的情况下对这些功能进行扩展  通过继承创建的新类称为子类或派生类 被继承的类称为基类 父类 或超类  继承的过程就是从一般到特殊的过程  要实现继承 可以通过继承和组合来实现 继承概念的实现方式有二类 实现继承和接口继承 实际继承是指直接使用基类的属性和方法而无需额外编码的能力 接口继承是指仅使用属性和犯法的名称 但是子类必须提供实现的能力
	多态:是指一个类实例的相同方法在不同情形有不同的表现方式 多态机制具有不同内部结构的对象可以共享相同的外部接口 这意味着 虽然针对不同对象的具体操作不同 但通过一个公共的类  他们的那些操作 可以通过相同的方式给予调用

五大基本原则:SPR, OCP, LSP, DIP, ISP

单一职责原则SRP(Single Responsibility Principle)
	是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌	的,但效率却高不起来。
	开放封闭原则OCP(Open-Close Principle)
	一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,	而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求	在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
	里式替换原则LSP(the Liskov Substitution Principle LSP)
	子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那	么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。
	依赖倒置原则DIP(the Dependency Inversion Principle DIP)
	具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中	的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直	接依赖A的实现,那么就可能 造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编	译B时同样要直接包含到A的cpp文件。
	接口分离原则ISP(the Interface Segregation Principle ISP)
	模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来
耦合
	简单地说,软件工程中对象之间的耦合度就是对象之间的依赖性。指导使用和维护对象的主要问题是对象之间的	多重依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。
	有软硬件之间的耦合,还有软件各模块之间的耦合。
	耦合性是程序结构中各个模块之间相互关联的度量。它取决于各个模块之间的接口的复杂程度、调用模块的方式以及哪	些信息通过接口。
	
耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:
•	内容耦合。当一个模块直接修改或操作另一个模块的数据时,或一个模块不通过正常入口而转入另一个模块时,这样的耦合被称为内容耦合。内容耦合是最高程度的耦合,应该避免使用之。
•	公共耦合。两个或两个以上的模块共同引用一个全局数据项,这种耦合被称为公共耦合。在具有大量公共耦合的结构中,确定究竟是哪个模块给全局变量赋了一个特定的值是十分困难的。
•	外部耦合 。一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
•	控制耦合 。一个模块通过接口向另一个模块传递一个控制信号,接受信号的模块根据信号值而进行适当的动作,这种耦合被称为控制耦合。
•	标记耦合 。若一个模块A通过接口向两个模块B和C传递一个公共参数,那么称模块B和C之间存在一个标记耦合。
•	数据耦合。模块之间通过参数来传递数据,那么被称为数据耦合。数据耦合是最低的一种耦合形式,系统中一般都存在这种类型的耦合,因为为了完成一些有意义的功能,往往需要将某些模块的输出数据作为另一些模块的输入数据。
•	非直接耦合 。两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。

总结

	耦合是影响软件复杂程度和设计质量的一个重要因素,在设计上我们应采用以下原则:如果模块间必须存在耦合,就尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。
内聚与耦合
	内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。
	耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 程序讲究的是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模  块之间的相互依存度却要不那么紧密。
	内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值