面向对象
早期编程因为受电脑硬件限制,程序都是追求效率,而忽略可理解性,扩充性,随着硬件技术的发展,编程愈来愈重视多人开发,程序员愈来愈重视程序的可靠性,可扩展性,可维护性,因此刺激了程序语言的发展php
面向过程程序员
- 程序员设计好程序代码流程图,辅助程序设计。优势:用什么功能就编写什么函数 缺点:数据管理上比较混乱 ,主要集中在函数成面上,面向对象把属性和方法进行封装,更好的可重用性和可扩展性
面向对象面试
- 万物皆对象,将构成问题的事务分解到各个对象上,创建对象的目的不是为了完成一个工做,而是为了描述某个事务在解决问题中的行为,更符合人的思惟习惯,代码重用性高,可扩展性好
面向对象和面向过程的核心区别是如何分配职责。
类和对象
面向对象是由一系统具备属性和方法的对象构成,对象之间相互交互 ,从而实现业务需求。sql
属性数据库
- 在类中定义的变量,即为成员属性,用于描述对象静态特性的数据。如人的姓名,性别,首字母小写
方法编程
- 函数定义在类中即为成员方法,用于描述对象动态特性的操做行为,方法名不区分大小写,不可重名,首字母小写
对象生命周期服务器
- 建立后,生命周期开始,当程序结束后或程序员清除对象后即销毁,PHP会自动销毁对象
类是一种抽象的概念,是具备相同语义定义对象的集合(具备相同属性和方法的集体),使用具体的类是不可行的,只能实例化。拿汽车举例,汽车的设计图纸就是类,汽车是对象。设计中重点是类的建立微信
类名书写规范架构
- 类名首字母大写
- 一个类定义在一个文件中
$this
对象中使用 $this
指针能够访问属性或方法。并发
class Code { protected $len = 5; public function make() { return $this->len . $this->show(); } public function show() { return ' : is show'; } } echo (new Code)->make();
继承
经过使用 extends
能够继承父类的属性与方法,在PHP中继承是单一的。
class Notify { public function message() { return 'notify message'; } } class User extends Notify { } echo (new User)->message();
父类调用
子类可使用 parent
关键字调用父类方法
... public function message() { return parent::message(); } ...
方法重写
子类能够重写父类的方法,除非父类的方法没有使用 final
修饰。
class Notify { public function message() { return 'notify message'; } } class User extends Notify { public function message() { return 'user notify'; } } echo (new User)->message();
禁止重写
使用final声明的方法,将禁止在子类中重写父类方法。
public final function message() { return 'notify message'; }
封装
public 公有
- 在类的内部与外部或子类均可以访问,是最开放的权限
private 私有
- 定义类的属性和方法,在类的内部能够访问,在类的外部或子类都不能够访问
protected 受保护
- 定义类的属性和方法,在类的内部或子类能够访问,类的外部不能够访问
模块设计
- 强内聚(功能尽可能在类的内部完成),弱耦合(开放尽可能少的方法给外部调用)。例:公司销售接项目,具体工做交给公司内部程序员,设计人员,服务器管理人员协同完成
trait
使用trait
机制能够变相的使用多重继承。
class Alipay { use Pay; } class WePay { use Pay; } trait Pay { public function sn() { return 'ABCDEF'; } } echo (new WePay)->sn();
若是本类与 trait 中存在同名的属性和方法时,将使用本类中的属性与方法。
... class WePay { use Pay; public function sn() { return __METHOD__; } } trait Pay { public function sn() { return 'ABCDEF'; } } ...
多个trait
可使用多个 trait
用逗号链接
... use Pay,Site; ...
解决冲突
class WePay { use Pay, Email { Pay::notify insteadof Email; Email::notify as EmailNotify; } trait Pay { public function notify() { return __METHOD__; } } trait Email { public function notify() { return __METHOD__; } } echo (new WePay)->notify();
Pay::notify insteadof Email
表示使用 Pay::notify
方法替代 Email::notify
方法。
Email::notify as EmailNotify` 将`Email:notify` 别名为 `EmailNotify
访问控制
能够为继承的 trait 方法从新定义访问控制
class WePay { use Pay, Email { Pay::notify insteadof Email; Email::notify as protected EmailNotify; ... }
多重trait
能够经过多个trait
组合来使用。
trait Notify { public function response() { return 'notify response'; } } trait Pay { use Notify; } class User { use Pay; } echo (new User)->response();
抽象方法
trait Notify { public function response() { return 'notify response' . $this->sn(); } abstract protected function sn(); } trait Pay { use Notify; } class User { use Pay; protected function sn() { return 'SN999'; } } echo (new User)->response();
静态方法
在 trait
中可使用静态方法、抽象方法、静态属性。
... trait Pay { public function sn() { return 'ABCDEF'; } public static function notify() { return __METHOD__; } } class WePay { use Pay; ... } echo WePay::notify();
static
static:
- 须要一个数据对象只服务于类,即类内部可用,对外不可用时。建对象是极其耗费资源的,所以当一个方法具备比较强的公用性的时候,没有必要为了调用这个方法而从新再生成该类的实例。定义的方法或变量在程序第一次加载时即驻留内存,程序结束释放。
static变量:
- 经过static声明的成员变量为静态变量或叫类变量,是该类的公共变量,在第一次使用时即生成,对于该类的全部对象只有一份,是属于类的,不是属于对象的。static变量是属于类而不属于对象,能够在任何地方通地类来访问,是类的全局变量,类建立时即存入内存。对多个对象来讲,静态数据成员只存储一处,能够节省内存。只要对静态数据成员的值更新一次,保证全部对象存取更新后的相同的值。
static方法:
- 用static声明的方法为静态方法或叫类方法,执行该方法时不会将对象引用传给函数,因此咱们不能访问非静态成员,只能访问静态方法或静态变量。只能使用关于类的方式如self static parent等。使用时不用生成对象便可执行
类常量
使用 const
来定义类常量,常量使用 self::
来调用。
class Model implements ArrayAccess, Iterator { use ArrayIterator, Relation, Validate, Auto, Filter; //----------自动验证---------- //有字段时验证 const EXIST_VALIDATE = 1; //值不为空时验证 const NOT_EMPTY_VALIDATE = 2; ... }
$this self:: parent::
$this
- 是当前对象的引用, 通常出如今方法里,用于获取类的成员属性,或执行类的成员方法
self::
- 对本类的引用 ,用于获取当前类的表态成员属性或静态成员方法self::run()
parent::
- 对父类的引用,调用父类的方法或属性。
魔术方法
构造方法&析构方法
构造方法__construct()
- 在建立对象时自动执行,没有返回值,用于执行类的一些初始化工做,如对象属性的初始化工做,构造方法为__construct()。
- 能够在构造方法中传递参数,用于定义属性,在父类和子类都定义构造方法时,执行子类的构造方法
析构方法__destruct():
- 当全部对象的引用被销毁时执行。
__get 与__set
读取不可访问或不存在的属性时,__get() 会被调用,同理获取不可访问或不存的的属性时会执行 __set() 方法。
<?php abstract class Query { abstract protected function record(array $data); public function select() { return $this->record(['name' => '后盾人', 'age' => 33]); } } class Model extends Query { protected $field = [ 'name' ]; public function all(){ $this->select(); return $this->field; } protected function record(array $data) { $this->field = $data; } public function __get($name) { return $this->field[$name] ?? null; } public function __set($name, $value) { $this->field[$name] = $value; } } $user = new Model; $user->all(); echo $user->name; $user->name = '向军大叔'; echo $user->name;ry
### __isset() 与 __unset()
当使用 isset()函数或者empty()函数 判断属性是否存在或者是否为空的时候会自动触发。
当使用 unset() 函数判断属性时,若是存在__unset() 方法将会执行。
... public function __unset($name) { if (!isset($this->field[$name]) || in_array($name, $this->deny)) { throw new Exception('禁止操做'); } } public function __isset($name) { return isset($this->field[$name]); } ...
抽象类&抽象方法
具备抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承,经过extends来实现,抽象类中也能够定义普通方法
父类方法执行方式不肯定,但子类还都有这个方法
- 例1:如交通工具类:定义抽象方法控制交通工具运行方式,这样每一个交通工具如飞机,汽车都要重写父类方法。若是在父类工具类定义该方法(好比在地上走)没有任何意义,由于每一个交通工具都要重写(飞机要重写方法,船要重写方法),因此针对你类方法的不肯定性,咱们须要抽象方法,实现多态。
例2:定义动物类,每一个动物都有叫声方法,可是表面不一样,因此要定义为抽象类,让每种动物类去实现功能。
- 当父类为抽象类时,子类必须重写父类的抽象方法
- 抽象类里不必定非要写抽象方法,但有抽象方法的类必须定义为抽象类
- 抽象类必须继承使用
- 抽象方法不能有主体即{}
- <?php abstract class AbstractClass { // 强制要求子类定义这些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue(); } }
接口
接口是一组成员声明方法的集合,包含空的成员方法和常量,空的方法要求继承类去具体实现。成员方法为public,属性为常量。
-
- 例如:现实中的电脑USB或PCI插槽,插线板等都有接口例子
继承是一级一级层次式,若是某一层出现问题,整个继承就会出现意外。而接口只影响实现接口的类,接口能够在破坏原来的继承基础上对类扩展。接口能够实现多继承。
- 例:电脑USB接口,规定各个厂商必须构造合适的接口方法,好比手机,数码相机,网银U盾。要让各个厂商写本身的方法如U盾插到USB上他会自动安装网银驱盾,弹出网页,手机装上后能够打开手机里的内容,同时能够充电
抽象类及普通类均可以实现接口,经过关键字implements
接口与抽象类的区别:
- 1 接口只能用implements实现 抽象类用extends继承实现
2 接口没有数据成员,能够定义常量,抽象类能够有
3 接口没有构造函数,抽象类能够定义构造函数
4 接口方法都是public 抽象类方法能够用protected private public来修饰
5 一个类能够实现多个接口,但只能继承一个抽象类
6 接口中不能够有成员方法,抽象类能够有成员方法
interface DbInterface { public function connectDb(); //得到链接 参数为表名 public function close(); //关闭数据库 public function exe($sql); //发送没有返回值的sql public function query($sql); //有返回值的sql } class Db implements DbInterface { public function exe($sql){ } public function query($sql{ } }
以上内容但愿帮助到你们,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文免费获取能够微信搜索关注公众号:PHP开源社区,或者访问: