课程咨询 :13623629309

太原PHP培训 > 达内新闻 > PHP 读书笔记(一)
  • 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高级开发名企定制班(剩2个名额)

php高级开发名企定制班(剩2个名额)

开班日期:12-29

php高级开发周末班(剩5个名额)

php高级开发周末班(剩5个名额)

开班日期:12-29

php高级开发免费试听(剩5个名额)

php高级开发免费试听(剩5个名额)

开班日期:12-29

更多高级开发工程师精品班

更多高级开发工程师精品班

开班日期:12-29

  • 地址:山西省太原市小店区学府街长治路高新国际A座24层
  • 课程培训电话:13623629309     全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56

    在线客服系统