1.OOP理解
OOP就是面对对象编程是相对面对过程编程的升级以适应更多的业务场景。AOP面对切面编程是对OOP的再一次升级以适应更加复杂的应用场景。OOP包括抽象,封装,继承,多态四大特征。抽象就是把一些具有公共特征的事物抽象为一个类,例如:把所有的人抽象为人类(human),人类有性别,年龄等属性,有吃饭,运动等行为(方法).封装就是通过private,protected,public等关键字来增加类里面的方法和属性的访问控制。继承就是子类通过extends关键字可以复用父类的一些属性和方法,减少代码冗余度。例如:人类可以分为男人和女人两个子类,它们也都有性别,年龄属性,吃饭,运动方法,不需要重新定义直接用父类就行了。多态按字面的意思就是“多种状态”,接口(interface)的多种不同的实现方式即为多态。接口就是定义一些规范,让所有想实现它的都必须遵守。例如:人类需要遵守法律
2.OOP应用
这里的OOP应用主要以PHP为例:
目前大多数PHP项目基本上都是基于框架(THINKPHP,LARAVEL等)开发,很少用原生的PHP代码来写。毕竟框架将我们项目中频繁用到的东西(数据库操作ORM,权限认证,文件处理等)都统一封装好了,我们主要调用相应的接口就行了。框架基本上都是基于MVC设计模式来的,深入的结合OOP思想。
在PHP中有抽象类,定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。
<?php
abstract class AbstractClass
{
// 我们的抽象方法仅需要定义需要的参数
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// 我们的子类可以定义父类签名中不存在的可选参数
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
以上例程会输出:
Mr. Pacman
Mrs. Pacwoman
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。
Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
以上例程会输出:
Hello World!
PHP 7 开始支持匿名类。 匿名类很有用,可以创建一次性的简单对象。
<?php
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
以上例程会输出:
object(class@anonymous)#1 (1) {
["Command line code0x104c5b612":"class@anonymous":private]=>
int(10)
}
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。