太原PHP培训
达内太原php培训中心

0351-5608878

热门课程

PHP 读书笔记(一)

  • 时间:2016-11-01
  • 发布:简书
  • 来源:简书

PHP 读书笔记(一)

现在有很多热衷于学习php的人,但是对于学习就要有良好的学习笔记。太原php培训班为大家带来一篇。

你的解耦工具

在下面的文章中,主要会围绕去耦给出5大工具,让你轻松去耦。

Design PatternsA Primer

SOLID Design Principles

Depedency Injection

Defining a Contract with Interfaces

Abstracting with Adapters

先介绍第一个工具:设计模式。

Design PatternsA Primer

设计模式是对软件中通用问题的总结,有了设计模式,方便我们进行交流,譬如一说MVC,我们就知道是怎么回事了,不然我们必须巴拉巴拉一大堆话去描述,不易于传播、交流,一个好的设计模式必然有一个简单易懂的名字,因为只有简单的东西,才能被大家广泛传播。

如今,一谈到设计模式,被大家广泛传播的就是1994年四人帮提出的23种模式,分为了3大类别:

Creational

Structural

Behavioral

本书不会去按个介绍23个模式,这样去介绍的书籍太多了,而且本书也没有那么多篇幅去按个讲,但是这些都是再进行展开的基础,因此我们会介绍一些最近本的概念:

Factory:负责生产对象,类似于语言本省提供的new关键字,在C++中与new的不同就在于,new不能通过string直接实例化对象,但是factory可以

Repository:不是GoF中提出的设计模式,其类似于一个仓库,负责数据的存储和获取

Adapter:适配器,故名思议就是将接口实现转换

Strategy:目的是灵活性,将一个或一组行为封装起来,方便的进行替换

对上面的概念具体展开

The Factory Patterns

简单代码:

$customer = new Customer();

如果customer足够简单,上面的创建没有问题,但是如果customer创建的时候,必须进行一堆初始化,那我们就疯了,一个简单的想法,当然是将这些创建逻辑抽离出来,变为一个函数,进行复用,因此就有下面的版本,

复杂代码:

class CustomerFactory {

protected $accountManagerRepo;

public function __construct(AccountManagerRepository $repo) {

$this->accountManagerRepo = $repo;

}

public function createCustomer($name) {

$customer = new Customer();

$customer->setName($name);

$customer->setCreditLimit(0);

$customer->setStatus('pending');

$customer->setAccountManager(

$this->accountManagerRepo->getRandom()

);

return $customer;

}

}

总结下出现上面代码的原因: 软件复杂度的提升 ,可以这么说,软件中各种问题的出现,都是因为软件的复杂度,不同的复杂度有不同的应对方法,总的目标都是为了降低复杂度

那上面出现的 CustomerFactory 带来的好处是:

Reusable code.创建的地方都可以调用这段代码,降低了代码的复杂度。

Testable code.由于关注点分离了,方便测试,可以单独进行创建逻辑的测试

Easy to change.创建逻辑只在一处,方便修改

Static Factories

class CustomerFactory {

public static function createCustomer($name) {

$customer = new Customer();

$customer->setName($name);

$customer->setCreditLimit(0);

$customer->setStatus('pending');

return $customer;

}

}

$customer = CustomerFactory::createCustomer('ACME Corp');

静态工厂,通过一个static方法访问,那怎么评判是静态工厂好,还是上面一个工厂好呢?答案是:

It depends

没有最好的,只有更合适的,如果静态方法能满足需求,那就是用静态工厂,如果你是数据源会经常变化,那就使用实例化工厂,并且将需要的依赖注入进来。

Types of Factories

The Factory Method pattern:定义了创建对象的方法,但是具体创建哪个对象,由子类决定

The Abstract Factory pattern:抽象工厂模式的粒度更粗一点,不仅管一个对象的创建,而是管着一组相关对象的创建

talk is cheap,show me the code

让我们上代码的。

class Document {

public function createPage() {

return new Page();

}

}

如果我们又好几种page,怎么办?

class Document {

public function createPage($type) {

switch $type {

case "ResumeDocument":

return new ResumePage();

case "PortfolioDocument":

return new PortfolioPage();

}

}

}

上面代码的问题是:我们每次新曾一个类型的page,必须要修改 createPage 方法,不满足开放封闭原则(OCP),那PHP有个好处是,直接传递给new字符串就能创建对象,看代码:

class Document {

public function createPage($type) {

return new $type;

}

}

问题:我们无法验证传入 $type 的有效性,而且对 createPage 返回的类型,我们也无法检查,那怎么办呢?

思路是:将创建逻辑按照关注点分离的逻辑,每个类型的document创建自己的page,这就解决了 $type 的有效性问题,那对于返回值,我们定义一个公共接口,只有实现这个接口的才是符合预期的。

abstract class AbstractDocument {

abstract public function createPage():PageInterface;

}

class ResumeDocument extends AbstractDocument {

public function createPage():PageInterface {

return new ResumePage();

}

}

class PortfolioDocument extends AbstractDocument {

public function createPage():PageInterface {

return new PortfolioPage();

}

}

interface PageInterface {}

class ResumePage implements PageInterface {}

class PortfolioPage implements PageInterface {}

好了,今天就给大家讲这么多吧,喜欢我的内容可以关注或者分享(微信公众平台:tytedu)选择太原达内培训,不再孤军奋战,轻轻松松做IT高薪白领。太原达内培训带领有明确目标的学子迈向成功之路!

上一篇:php的include_once,require_once值得注意的小细节
下一篇:PHP 读书笔记(二)

太原php培训资源站

太原PHP编程开发并发编程槽与坑

Php开发规划自己的路

太原php培训老生常谈php

选择城市和中心
贵州省

广西省

海南省