PHP 面向对象编程
文章目录
-
PHP开发中常用的代码复用有继承(extend)、多态(interface)、trait(性状)。
OOP(Object Oriented Programming):面向对象编程,三大特性:封装、继承、多态。
为什么要使用trait,使用它有什么好处:
- 开发人员能够自由地在不同层次结构内独立的类中复用 method,在一定程度上弥补了单继承语言在某些情况下代码不能复用的问题。
- 在PHP中,只能实现单继承。而Trait则避免了这点
trait与普通类的相同点:
- trait 能够像普通的类一样定义属性,方法(包含抽象的、静态的、抽象的);
- trait 引入到基类里面,其子类里面也能访问trait里面的属性和方法。
trait与普通类的不同点
- trait不用实例化就能访问定义的普通方法以及属性。
- trait里面不能定义构造函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<?php // trait 方法重写案例 trait Calculator { function increase($num){ return $num+1; } } class ClassName { use Calculator{ increase as protected increaseMore; } function increase($num){ $num=$num+10; return $this->increaseMore($num); } }
-
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配现象的技术。
简单的说,ORM就是对象模型和关系模型的一种映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
作用:ORM就是数据访问层强大的一种解决方案,通过它,可以最大限度隔离业务逻辑层和数据源之间的耦合度。
-
在new类名前面写反斜杠的作用 new \PHPExcel() , 这个斜杠表示,如果当前类中没有,就去全局搜索这个类[全局命名空间]。
-
命名空间
PHP 命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:
-
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为currentnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。详情参见 使用命名空间:后备全局函数名称/常量名称。
-
限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
-
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo
-
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
-
-
类设计,性状(trait)优于继承。优先考虑用组合关系提高代码的可重用性 。继承使得子类和父类捆绑在一起。组合仅通过唯一接口和外部进行通信,耦合度低于继承。
底层代码多用组合,顶层/业务层代码多用继承。底层用组合可以提高效率,避免对象臃肿。顶层代码用继承可以提高灵活性,让业务使用更方便。 参考原文