PHP 的类,OOP,实体和设计模式 简述
类和对象被添加到PHP 5中,因此WordPress已经使用了这些功能,但不是非常广泛或全面:WordPress中的编码范例主要是函数式编程(通过调用缺少应用程序状态的函数来执行计算)而不是面向对象编程(OOP)(通过操纵对象的状态来执行计算)。因此,我还描述了类和对象以及如何通过OOP使用它们。
OOP是生成模块化应用程序的理想选择:类允许创建组件,每个组件都可以实现特定功能并与其他组件交互,并且可以通过其封装的属性和继承提供自定义,从而实现高度的代码可重用性。因此,应用程序的测试和维护成本更低,因为个别功能可以与应用程序隔离并自行处理; 由于开发人员可以使用已经开发的组件并避免为每个应用重新发明轮子,因此也提高了生产率。
类具有属性和函数,可以通过使用private
(仅可从定义类中protected
访问)(可从定义类及其祖先和继承类中public
访问)和(可从任何位置访问)来获得可见性。在函数中,我们可以通过在名称前添加$this->
来访问类的属性:
class Person {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function getIntroduction() {
return sprintf(
__('My name is %s'),
$this->name
);
}
}
通过new
关键字将类实例化为对象,之后我们可以通过->
方式访问其属性和函数:
$person = new Person('Pedro');
echo $person->getIntroduction();
// This prints "My name is Pedro"
继承类可以覆盖其父类中的函数public
和protected
函数,并通过在它们前面加上来访问父类函数parent::
:
class WorkerPerson extends Person {
protected $occupation;
public function __construct($name, $occupation) {
parent::__construct($name);
$this->occupation = $occupation;
}
public function getIntroduction() {
return sprintf(
__('%s and my occupation is %s'),
parent::getIntroduction(),
$this->occupation
);
}
}
$worker = new WorkerPerson('Pedro', 'web development');
echo $worker->getIntroduction();
// This prints "My name is Pedro and my occupation is web development"
可以创建一个方法abstract
,这意味着它必须由继承类实现。abstract
必须自己创建一个包含方法的类abstract
,这意味着它无法实例化; 只有实现抽象方法的类才能被实例化:
abstract class Person {
abstract public function getName();
public function getIntroduction() {
return sprintf(
__('My name is %s'),
$this->getName()
);
}
}
// Person cannot be instantiated
class Manuel extends Person {
public function getName() {
return 'Manuel';
}
}
// Manuel can be instantiated
$manuel = new Manuel();
类还可以定义static
方法和属性,这些方法和属性位于类本身下,而不是作为对象的类的实例化。这些是通过self::
类内部访问的,并通过类+的名称::
从外部访问:
class Factory {
protected static $instances = [];
public static function registerInstance($handle, $instance) {
self::$instances[$handle] = $instance;
}
public static function getInstance($handle) {
return self::$instances[$handle];
}
}
$engine = Factory::getInstance('Engine');
设计模式是标准化的,并且有良好的文档记录,使开发人员能够理解应用程序中的不同组件是如何相互关联的,并提供一种有序地构造应用程序的方法,这有助于避免使用 污染全局环境的全局变量(如 global $wpdb)。