设计模式

有很多方法可以为您的Web应用程序构建代码和项目,您可以根据自己的喜好将其添加到架构中。但遵循常见模式通常是一个好主意,因为它会使您的代码更易于管理,更容易让其他人理解。

最常用的设计模式之一是工厂模式。在此模式中,类只是创建您要使用的对象。请考虑以下工厂模式示例:

<?php
class Automobile
{
private $vehicleMake;
private $vehicleModel;

public function __construct($make, $model)
{
    $this->vehicleMake = $make;
    $this->vehicleModel = $model;
}

public function getMakeAndModel()
{
    return $this->vehicleMake . ' ' . $this->vehicleModel;
}
}

class AutomobileFactory
{
public static function create($make, $model)
{
    return new Automobile($make, $model);
}
}

// have the factory create the Automobile object
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');

print_r($veyron->getMakeAndModel()); // outputs "Bugatti Veyron"

此代码使用工厂来创建Automobile对象。以这种方式构建代码有两个可能的好处; 首先,如果您稍后需要更改,重命名或替换Automobile类,则可以这样做,您只需修改工厂中的代码,而不是项目中使用Automobile类的每个位置。第二个可能的好处是,如果创建对象是一项复杂的工作,您可以在工厂中完成所有工作,而不是每次要创建新实例时都重复它。

使用工厂模式并不总是必要的(或明智的)。这里使用的示例代码非常简单,工厂只会添加不必要的复杂性。但是,如果您正在制作一个相当大或复杂的项目,那么通过使用工厂可以为您节省很多麻烦。

独生子

在设计Web应用程序时,在概念上和体系结构上通常允许访问特定类的一个且仅一个实例。单例模式使我们能够做到这一点。

TODO:需要新的SINGLETON代码示例

上面的代码使用静态变量和静态创建方法实现单例模式getInstance()请注意以下事项:

当我们需要确保Web应用程序中的整个请求生命周期中只有一个类的单个实例时,单例模式很有用。当我们拥有全局对象(例如Configuration类)或共享资源(例如事件队列)时,通常会发生这种情况。

在使用单例模式时,您应该小心谨慎,因为它本质上会将全局状态引入您的应用程序,从而降低可测试性。在大多数情况下,可以(并且应该)使用依赖注入来代替单例类。使用依赖注入意味着我们不会在应用程序的设计中引入不必要的耦合,因为使用共享或全局资源的对象不需要知道具体定义的类。

战略

使用策略模式,您可以封装特定的算法族,允许负责实例化特定算法的客户端类不了解实际的实现。战略模式有几种变体,其中最简单的概述如下:

第一段代码片段概述了一系列算法; 你可能想要一个序列化数组,一些JSON或者只是一个数组:

<?php

interface OutputInterface
{
public function load();
}

class SerializedArrayOutput implements OutputInterface
{
public function load()
{
    return serialize($arrayOfData);
}
}

class JsonStringOutput implements OutputInterface
{
public function load()
{
    return json_encode($arrayOfData);
}
}

class ArrayOutput implements OutputInterface
{
public function load()
{
    return $arrayOfData;
}
}

通过封装上述算法,您可以在代码中使其更好,更清晰,其他开发人员可以轻松添加新的输出类型而不会影响客户端代码。

您将看到每个具体的“输出”类如何实现OutputInterface - 这有两个目的,主要是它提供了一个简单的契约,任何新的具体实现都必须遵守。其次,通过实现一个通用接口,您将在下一节中看到,您现在可以使用类型提示来确保使用这些行为的客户端在这种情况下是'OutputInterface'的类型是正确的。

下一段代码概述了调用客户端类如何使用这些算法之一,甚至更好地设置运行时所需的行为:

<?php
class SomeClient
{
private $output;

public function setOutput(OutputInterface $outputType)
{
    $this->output = $outputType;
}

public function loadOutput()
{
    return $this->output->load();
}
}

上面的调用客户端类有一个私有属性,必须在运行时设置并且类型为'OutputInterface'一旦设置了此属性,对loadOutput()的调用将调用具有输出类型的具体类中的load()方法已经设定。

<?php
$client = new SomeClient();

// Want an array?
$client->setOutput(new ArrayOutput());
$data = $client->loadOutput();

// Want some JSON?
$client->setOutput(new JsonStringOutput());
$data = $client->loadOutput();

前控制器

前端控制器模式是Web应用程序的单个入口点(例如index.php),用于处理所有请求。此代码负责加载所有依赖项,处理请求并将响应发送到浏览器。前端控制器模式可能是有益的,因为它鼓励模块化代码,并为您提供一个中心位置来挂钩应该为每个请求运行的代码(例如输入清理)。

模型 - 视图 - 控制器

模型 - 视图 - 控制器(MVC)模式及其亲属HMVC和MVVM允许您将代码分解为服务于特定目的的逻辑对象。模型用作数据访问层,在该层中获取数据并以整个应用程序中可用的格式返回。控制器处理请求,处理从模型返回的数据并加载视图以在响应中发送。视图是在响应Web浏览器时发送的显示模板(标记,xml等)。

MVC是流行的PHP框架中最常用的架构模式

了解有关MVC及其亲属的更多信息:

原文