php 和设计模式 - 命令行模式
发表于|更新于|设计模式
|总字数:144|阅读时长:1分钟|浏览量:
用过 laravel 框架的应该都知道,其脚本模块非常强大,这些脚本,也就是命令行模式。
说到命令行,就不得步提一下 cli 和 cgi 的区别,在 nginx 中,php 并不是直接执行的,而是通过 cgi 调用 php 并获取执行结果。
而 cli 就是命令行接口,主要用于 shell 脚本的开发。
1 | php command.php |
不多说了,回头再专门看一下这方面的东西。
文章作者: m-finder
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 M-finder!
相关推荐

2021-03-21
php 和设计模式 - 迭代器模式
提供一种方法顺序访问一个集合对象中的各种元素,而又不暴露该对象的内部表示。 foreach 的底层就是迭代器。很多编程语言都已经将其作为一个基础类库实现出来了,所以也就有了这个模式目前学习意义大于实际意义的说法。 在 php 中,内部已提供 Iterator 接口,可以直接使用。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879class Bookshelf implements \Countable, \Iterator{ protected array $books = []; protected int $current = 0; public function addBook(Book $book) { $this->books[] = $book; } public function current() { return $this->books[$this->current]; } public function next() { return $this->current++; } public function key(): int { return $this->current; } public function valid(): bool { return isset($this->books[$this->current]); } public function rewind() { $this->current = 0; } public function count(): int { return count($this->books); }}class Book{ protected string $author; protected string $title; public function __construct(string $author, string $title) { $this->author = $author; $this->title = $title; } public function getAuthor(): string { return $this->author; } public function getTitle(): string { return $this->title; } public function getAuthorAndTitle(): string { return $this->getAuthor() . '-' . $this->getTitle(); }}$bookA = new Book('wu', 'php');$bookB = new Book('wu', 'redis');$bookshelf = new Bookshelf();$bookshelf->addBook($bookA);$bookshelf->addBook($bookB);foreach ($bookshelf as $book) { echo $book->getAuthorAndTitle(), PHP_EOL;} 使用起来还是比较简单的,至于如何实现就不写了。

2021-03-21
php 和设计模式 - 状态模式
通过改变类的状态来实现对它行为的切换。 看代码还是比较好理解的: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869abstract class State{ protected string $state; public function getState(): string { return $this->state; } abstract public function handle();}class StateContext{ protected State $state; public function setState(State $state) { $this->state = $state; } public function getState(): string { return $this->state->getState(); } public function handle() { $this->state->handle(); }}class CreateOrder extends State{ public function __construct() { $this->state = 'create'; } public function handle() { echo '创建订单', PHP_EOL; }}class FinishOrder extends State{ public function __construct() { $this->state = 'finish'; } public function handle() { echo '结束订单', PHP_EOL; }}$stateContext = new StateContext();$stateContext->setState(new CreateOrder());$stateContext->handle();echo $stateContext->getState(), PHP_EOL;$stateContext->setState(new FinishOrder());$stateContext->handle();echo $stateContext->getState(), PHP_EOL; 将状态独立,然后在外部控制状态切换,已实现对其行为控制。

2021-03-21
php 和设计模式 - 生成器模式
生成器模式也叫建造者模式,主要用于将一个复杂对象的构造与它的表示分离。该模式允许你使用相同的代码生成不同类型和形式的对象。 什么是复杂对象呢?举个🌰,人类,都有个脑袋,有个身体,又有两条胳膊腿儿,那么,我们就可以把人看作是一个复杂对象。 那么,对于生成器模式来说,我们要把人类对象的创建与它的实例表示进行分离。 class Human { public function setHead(string $head) { echo 'head:', $head, PHP_EOL; } public function setBody(string $body) { echo 'body:', $body, PHP_EOL; } public function setArms(string $leftArm, string $rightArm) { echo 'left arm:', $leftArm, ' right arm:', $rightArm, PHP_EOL; } } interface Builder { public function buildHead(); public function buildBody(); public function buildArms(); public function getResult(): Human; } class HumanBuilder implements Builder{ private Human $human; public function __construct() { $this->human = new Human(); } public function buildHead() { $this->human->setHead('ai'); } public function buildBody() { $this->human->setBody('body'); } public function buildArms() { $this->human->setArms('left', 'right'); } public function getResult(): Human { return $this->human; } } class Director{ public function builder(Builder $builder): Human { $builder->buildHead(); $builder->buildBody(); $builder->buildArms(); return $builder->getResult(); } } $director = new Director(); $human = $director->builder(new HumanBuilder()); 好了,生成器模式到此结束。

2021-03-21
php 和设计模式 - 依赖注入模式
依赖注入是控制反转的一种实现方式。要实现控制反转,需要将创建被调用者实例的工作交由 IOC 容器完成,然后在调用者中注入被调用者,通常使用构造器或方法注入实现。这样我们舅实现了调用者和被调用者的解偶,这个过程就是依赖注入。 那么控制反转是什么呢?其实也就是 A 依赖于 B,常规做法是在 A 中直接实例化 B,那么控制反转就是将 B 在外部实例化,然后传入 A 去使用。看完以后,其实对依赖注入也就有了理解。 12345678910111213141516171819202122232425262728class Computer{ protected HardDisk $hardDisk; public function __construct(HardDisk $disk) { $this->hardDisk = $disk; } public function run() { $this->hardDisk->run(); echo '一台没有感情的电脑开始运行', PHP_EOL; }}class HardDisk{ public function run() { echo '一块没有感情的硬盘开始运行', PHP_EOL; }}$disk = new HardDisk();$computer = new Computer($disk);$computer->run(); 以上代码就是一个简单的依赖注入,你以为这就结束了?并没有,咱们在学一下 IOC 容器: 1234567891011121314151617181920212223242526272829class Container{ public array $bindings = []; public function bind($key, Closure $value) { $this->bindings[$key] = $value; } public function make($key) { $new = $this->bindings[$key]; return $new(); }}$container = new Container();$container->bind('disk', function (){ return new HardDisk();});$container->bind('computer', function () use($container){ return new Computer($container->make('disk'));});$computer = $container->make('computer');$computer->run(); ok,以上就是依赖注入的全部代码了。

2021-03-21
php 和设计模式
场面话工作几年,复杂的业务场景,重复的 CURD 一直在消耗着我作为程序员的激情与精力,在设计模式这方面的积累从来都不够完善,出去面试时还经常会面临面试官的灵魂拷问,总觉得自己是不是就快被淘汰了。 所以,是时候下功夫整理下这方面的知识了。 开始之前,要考虑一个问题,我们为什么要学习设计模式呢? 首先从概念来讲,设计模式作为一种描述问题及其解决方案的方法,是无数的 IT 前辈在工作中总结出的 特定场景 下的 最佳解决方案,那么当我们遇到同样的场景时,就可以通过使用模式,来实现符合自己程序的解决方案,以此降低代码的耦合度,提高代码的质量,同时也方便我们后期对程序进行调整或拓展。 第二,现在大部分 PHP 程序都是依托于框架进行开发,一般情况下,我们对于框架的使用,只是局限于在一个强大的程序基础设施上添加一些小装饰。那么学习并掌握设计模式以后,我们就能够理解框架是如何解决问题,以及框架解决问题的策略,随着开发的深入,我们也能够以设计为导向,开发出自己的可复用的代码库,这对我们来说,也是一种极大的积累和提升。 第三,对于团队来说,人来人往是常态,对于从一开始就已经接手项目的成员来说,理解程序的逻辑会很轻松,但是对于新加入的成员来说,采用标准化设计模式的程序才是更容易的理解和掌握的存在,这可以使新成员更快的参与到项目的开发工作中,发挥出他作为项目成员的作用。 第四,设计模式定义了专业词汇,通过这些词汇,开发人员之间的沟通变得更加容易,可以节省很多沟通成本。 设计模式与面向对象密切相关,因此我应该不会简单的复制一堆模式来加以理解,而是从面向对象入手,逐渐向设计模式演深。 源码 目录对象 设计原则 设计模式分类 工厂模式 单例模式 生成器模式 原型模式 门面模式 适配器模式 装饰器模式 桥接模式 代理模式 组合模式 享元模式 依赖注入模式 注册模式 流接口模式 策略模式 模板方法模式 观察者模式 迭代器模式 责任链模式 命令行模式 备忘录模式 状态模式 访问者模式 中介者模式

2021-03-21
php 和设计模式 - 策略模式
定义一组算法,把它们一个个封装起来,并使它们能够快速切换。本模式使得算法可以独立于使用它的客户而变化。一般用于避免多重条件判断和在运行时进行更改。 123456789101112131415161718192021222324252627282930313233343536373839404142434445interface Strategy{ public function algorithm();}class AlgorithmA implements Strategy{ public function algorithm() { echo '算法 A', PHP_EOL; }}class AlgorithmB implements Strategy{ public function algorithm() { echo '算法 B', PHP_EOL; }}class Context{ protected Strategy $strategy; public function __construct(Strategy $strategy) { $this->strategy = $strategy; } public function callAlgorithm() { $this->strategy->algorithm(); }}$algorithmA = new AlgorithmA();$contextA = new Context($algorithmA);$contextA->callAlgorithm();$algorithmB = new AlgorithmB();$contextB = new Context($algorithmB);$contextB->callAlgorithm(); 跟工厂模式非常相似,但是策略模式属于行为型模式,并不会返回一个具体的对象,而是强调其行为。通过调用上下文将要调用的方法封装起来,客户端只要调用上下文的方法就可以了。 那么,跟工厂结合一下是不是更好呢?