php

PHP 使用Travis CI持续集成composer包

这篇文章的内容可以说是上一篇文章发布自己的composer包的后续。主要内容分为2个部分: 单元测试,PHPUnit 持续集成,Travis CI 单元测试 首先单元测试的概念这里就不细说了,网上有很多资料,然后有关单元测试有没有必要这个问题,我觉得存在即是合理的,实际在使用composer可以看到很多依赖的包中本身就保留了测试的部分,往往是一个tests目录。 PHP项目的测试常用的久是PHPUnit了,PHPUnit是一个单元测试框架,关于PHPUnit可能会出一个专门的系列,这里先埋一个坑。接下来将结合实例介绍PHPUnit的安装、编写和使用。 目录结构 现在看下我们composer包的结构,如果你看过我们上一篇文章,对该结构应该会比较熟悉: src/ tests/ composer.json phpunit.xml 我们把一些类似README.md的文件先去除了,因为它们和该篇文章无关。

  • sidfate
    sidfate
8 min read
composer

PHP 发布自己的composer包

在Packagist上发布自己的包最科学的方式应该就是通过github了,本文将结合实战图文讲述具体的操作流程。 在你的github上新建一个仓库,这里我们创建一个名为my-package的仓库。 将远程仓库克隆到本地,然后我们需要在本地仓库添加一些文件。最重要的一个文件是composer.json,我们可以直接新建这个文件并编写,当然我们还可以使用composer init命令按步骤自动生成。 解释下几个步骤: Package name,也就是包名包含2部分,<供应商名称>/<包的名称>,一般来说供应商名可以填写你的github用户名。 Require,可以看到在图中我们并没有设置require字段,我建议如果你知道你的代码依赖自己在composer.json生成后手动添加,因为在composer init中操作会去搜索你需要的包,比较耗时。 最终我们生成的composer.json文件应该是这个样子的。 { "name&

  • sidfate
    sidfate
5 min read
php

Laravel Contracts

Contracts Laravel的Contracts(契约)是一系列框架用来定义核心服务的接口,一系列的标准,用来解耦具体需求对实现的依赖关系。这个依赖问题在之前的依赖注入和服务容器的文章中提到过,你可以把Contracts理解成例子中的Mail接口。 框架对每个契约都提供了相应的实现。例如,Laravel为队列提供了各种驱动的实现,为邮件提供了由 SwiftMailer驱动的实现。 在Illuminate/Foundation/Application.php中你可以看到默认Contracts实现的绑定。 /** * Register the core class aliases in the container. * * @return void */ public function registerCoreContainerAliases() { $aliases = [ 'app' =>

  • sidfate
    sidfate
2 min read
php

Laravel 服务容器和依赖注入

依赖注入(DI) 当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合。这个时候解决方式是,A类应该去依赖B类的接口,把具体的类的实例化交给外部。 就拿在业务需求中经常会用到的发送邮件举例,假如我们现在在Business业务类中需要发送邮件,下面的代码可以实现。 <?php class Email { public function send() { echo "send an email"; } } class Business { protected $mailer; public function __construct(

  • sidfate
    sidfate
4 min read
php

ModernPHP 密码与时间相关

密码 password_hash()函数生成密码的hash值。该函数的第一个参数是纯文本密码,第二个参数选择所用的hash算法,目前支持的算法有PASSWORD_DEFAULT(采用bcrypt算法,PHP5.5.0默认)和PASSWORD_BCRYPT(使用 CRYPT_BLOWFISH 算法),第三参数指定所有的选项,选项有salt(手动指定的盐,7.0已被废弃)和cost(工作因子)。工作因子的默认值是10。 password_verify()函数可以验证密码和指定的哈希值,验证成功返回true,失败返回false。 password_needs_

  • sidfate
    sidfate
4 min read
php

ModernPHP PDO

简介 PDO(PHP Data Objects,PHP数据对象)是一系列的PHP类,抽象了不同数据库的具体实现,提供了统一的接口来操作不同的数据库。 数据库连接 PDO类的构造方法的第一个参数为字符串,指定了DSN(Data Source Name,数据源名称),提供数据连接的详细信息。DSN的开头是数据库驱动器的名称(例如mysql或sqlite),然后接一个":"号,后面是其他连接信息(主机名、端口号,数据库名和字符集等),更多内容可以查看pdo.drivers。PDO类构造方法的第二个参数和第三个参数分别是数据库的用户名和密码。举一个使用的列子: <?php

  • sidfate
    sidfate
5 min read
php

ModernPHP 过滤、验证和转义

html 使用htmlentities()函数过滤html输入,它会将字符转换成html实体。但是在默认情况下,htmlentities()函数不会转义单引号,也检测不出输入字符串的字符集。所以正确的使用方式是额外传入2个参数,即第一个参数是输入的字符串,第二个参数设为ENT_QUOTES常量,转义单引号,第三个参数设为输入字符串的字符集。 <?php $str = "A 'quote' is <b>bold</b>"; // Outputs: A 'quote' is

  • sidfate
    sidfate
2 min read
php

ModernPHP PSR

简介 PSR是PHP Standards Recommendation(PHP推荐标准)的简称。到目前为止,有四个被广泛认同的标准: PSR-1:基本代码风格 PSR-2:代码风格指南 PSR-3:日志记录器接口 PSR-4:自动加载 也许你还见过PSR-0(自动加载标准),PHP-FIG废弃了该推荐规范,用PSR-4替代了它。 PSR-1 php标签 必须把PHP代码放在或标签中。 编码 必须使用UTF-8 without BOM的编码。 目的性 一个PHP文件可以定义符号(类,性状,函数和常量等),或者执行副作用的操作(

  • sidfate
    sidfate
6 min read
php

ModernPHP FIG

对于PHP这门语言,众所周知的是其组件和框架的数量极其的多,毕竟世界上最好的语言。 如果你正在为项目选择PHP框架,你一定会为其多种多样的框架而头疼,例如有小巧精致的CI(CodeIgniter),最近几年都很火很全面的Laravel,国产框架ThinkPHP,或者企业使用广泛的Yii等等。 然后你可能会试着了解下每个框架的特性来个选出你想要的,你发现Symfony的辅助库很棒,大大减少了自己去封装时间,然而你考虑到你的项目的大小由此选择了CI,这时你会想到将Symfony的辅助库搬到CI框架中话就好了,但是你只能专门为你的项目编写一个一次性的适配器。 所以,看出问题了吗,单独开发的框架没有考虑到和其他框架的通信,而一旦你选择了这样的框架,你只能束缚在它的生态系统中了。 为了解决这个问题,一些PHP框架的开发者在php|tek碰头并组建了PHP Framework Interop Group(框架协同工作组,简称PHP-FIG,)。PHP-FIG制定了推荐规范,PHP框架可以自愿的遵守这些规范,改进与其他框架通信和共享的功能。PHP-FIG是框架代表自发组织的,

  • sidfate
    sidfate
3 min read
php

ModernPHP 闭包

简介 闭包和匿名函数是PHP5.3.0中引入的特性。下面介绍下这两个概念的定义,可能看上去会比较难理解,但是后面会给出实例可以更好的掌握。 闭包指的是在创建时封装周围状态的函数。即便闭包所在的环境不存在了,闭包中封装的状态依然存在。 匿名函数其实是没有名字的函数,匿名函数可以赋值给变量,也能像对象那样被传递,常常被用作函数或者方法的回调。 理论上讲,闭包和匿名函数是不同的概念,但是PHP将其是做相同的概念。PHP闭包的语法和普通函数相同,但是其实它是伪装成函数的对象,事实上是Closure类的实例。 闭包的创建 $closure = function($name) { return sprintf('Hello %s', $name); } echo $closure("Josh&

  • sidfate
    sidfate
4 min read
php

ModernPHP 生成器

简介 PHP生成器是PHP5.5.0引入的功能,生成器就是简单的迭代器,但与标准的PHP迭代器不同,PHP生成器不要求实现Iterator接口,从而减轻了类的负担。生成器会根据需求计算并产出要迭代的值,这对应用性能的影响重大。假如标准的PHP迭代器经常在内存中执行迭代操作,这要预先计算出数据集,性能低下;如果要使用特定的方式计算大量数据,对性能的影响更甚。此时我们使用生成器,即时计算出产出后续值,不占用宝贵的内存资源。 PHP生成器不能满足所有迭代操作的需求,因为如果不查询,生成器永远不知道下一个要迭代的值是什么,在生成器中无法快进或后退。生成器还是一次性的,无法多次迭代同一个生成器。不过,如果需要,可以重建或克隆生成器。 生成器的创建 生成器的创建很简单,因为生成器就是PHP函数,只不过要在函数中一次或多次使用yield关键字。与普通的PHP函数不同的是,生成器从不返回值,

  • sidfate
    sidfate
3 min read
php

ModernPHP 性状

性状是什么 这是PHP5.4.0引入的概念,既像类又像接口。性状是类的部分实现(即常量,属性和方法),可以混入一个或多个类中。性状有两个作用:表名类可以做什么(像是接口),提供模块化的实现(像是类)。 性状的作用 PHP语言使用的是典型的继承模型。在这个模型中,我们先创建基类,实现基本的功能,然后扩展这个基类,通过继承基类创建更多具体的类。这叫做继承层次结构,很多编程语言都是用这个模式。 但是,如果想让两个无关的PHP类具有类型的行为,应该如何去做?例如,Satellite(卫星类)和Car(汽车类)两个类的作用十分不同,在继承层次结构上没有共同的父类,

  • sidfate
    sidfate
3 min read
php

ModernPHP 命名空间

声明 namespace Symfony\Component\HttpFoundation; 这一行代码是PHP命名空间声明语句。声明语句始终应该放在<?php标签后的第一行。命名空间的作用是封装和组织相关的PHP类,就像在文件系统中把相关的文件放在同一个目录中一样。 PHP命名空间与操作系统的物理文件系统不同,这是一个虚拟的概念,没必要和文件系统的目录结构完全对应。但是,大多数的PHP组件为了兼容广泛使用的PSR-4自动加载器标准,会把子命名空间放到文件系统的子目录下。 导入 use Symfony\Component\HttpFoundation\Response; $r = new Response(); 当然,你还可以用别名的方式导入: use Symfony\Component\HttpFoundation\Response

  • sidfate
    sidfate
2 min read