php组件是啥,浅谈PHP组件、框架以及Composer

本篇文章主要介绍了PHP组件、框架以及Composer,具有一定的学习价值,感兴趣的朋友可以了解一下。

什么是组件

组件是一组打包的代码,是一系列相关的类、接口和Trait,用于帮助我们解决PHP应用中某个具体问题。例如,你的PHP应用需要收发HTTP请求,可以使用现成的组件如guzzle/guzzle实现。我们使用组件不是为了重新实现已经实现的功能,而是把更多时间花在实现项目的长远目标上。

优秀的PHP组件具备以下特性:作用单一:专注于解决一个问题,而且使用简单的接口封装功能

小型:小巧玲珑,只包含解决某个问题所需的最少代码

合作:PHP组件之间可以良好合作,组合在一起实现大型项目

测试良好:本身提供测试,而且有充足的测试覆盖度

文档完善:应该提供完善的文档,能让开发者轻易安装、理解和使用

组件 vs 框架

我们选择框架时,要为这个框架的工具投入很多,框架通常会提供大量工具,但却没有提供我们所需的某个工具时,痛苦就转嫁到我们头上,我们要寻找并集成自定义的PHP库。把第三方代码集成到框架中是件难事,因为第三方代码和框架可能没有使用相同的接口。

选择框架时,我们看中的是框架的未来,但是谁又能保证某个框架始终是完成某项工作最好的工具呢?存在多年的大型项目必须有好的表现,而且要时刻做好调整,如果选错了PHP框架,可能无法做到这一点。较旧的PHP框架可能由于缺乏社区支持而变慢或过时,这些旧框架通常使用过程式代码编写,而没有使用新式的面向对象代码以及PHP的一些新特性,总之,决定是否使用PHP框架时,要考虑的事情很多。

庆幸的是,Laravel在这些担忧方面表现良好,因此才能在众多PHP框架中脱颖而出,从某种意义上来说,Laravel也是个基于组件开发的框架(核心组件是自身的Illuminate库,功能实现上则大量依赖第三方组件),相比Symfony而言,上手又比较简单,所以兼具了扩展性和易用性。但是,Laravel也存在一些不足,比如Laravel自身的组件不能轻易解耦,用于Laravel框架之外(但是相信这种状况会有好转,比如其数据库和队列组件就可以解耦出去)。综合来看,Laravel仍是一个出色的框架,能帮组我们快速创建强大的应用。

那我们应该使用组件还是框架呢?答案是,使用正确的工具做正确的事,如果能通过一些PHP组件快速实现小型项目,那就使用组件,如果有多个团队成员开发大型项目,而且能从框架提供的约定准则和结构中受益,那就使用框架(如果是在纠结使用什么框架,那么选择Laravel吧,它不会让你失望),使用框架能够引导并加速项目的开发。

使用组件

Packagist

我们在Packagist中查找PHP组件,这个网站用于收集PHP组件,最好的PHP组件在Packagist中都能找到。

94cdd378a010c9b33952e9c445b2b33a.png

比如我们想使用一个http组件用于收发HTTP消息,在搜索框中搜索http,得到的第一个结果就是Guzzle,就用它吧。

Composer

Packagist是查找PHP组件的社区,Composer则是安装PHP组件的工具。Composer是PHP的依赖管理器,运行在命令行中,你告诉Composer需要哪些组件,Composer会下载并把这些组件自动加载到你的项目中,就这么简单。

Composer和Packagist紧密合作,如果你告诉Composer想要使用guzzlehttp/guzzle组件,Composer会从Packagist中获取guzzlehttp/guzzle组件,找到这个组件的仓库地址,确定要使用哪个版本,还能找出这个组件的依赖,然后把guzzlehttp/guzzle组件及其依赖下载到你的项目中。

此外,Composer会为项目中的所有PHP组件自动生成符合PSR标准的自动加载器,有效地抽象了依赖管理和自动加载,所以,对PHP社区来说,Composer是最重要的附加工具,没有之一,想想之前我们要使用诸如include、require、spl_autoload_register来手动实现自动加载的痛苦日子,这一点也不为过。

关于Composer的安装和使用,这里不赘述,请参考Composer中文网。

示例项目

下面我们通过一个示例项目来演示如何使用Composer和组件来开发一个PHP应用,这个应用的作用是扫描一个CSV文件中的URL,找出死链,该应用会向每个URL发HTTP请求,如果返回的HTTP状态码大于等于400,就把这个死链发给标准输出。这是一个命令行应用,开发好之后,我们会执行这个脚本,传入csv文件的路径,在标准输出中显示死链列表。

安装组件

开始之前,先看看哪些任务可以使用现有的PHP组件解决:我们需要一个可以迭代处理csv文件数据的组件,此外还要向csv文件中的每个URL发送HTTP请求,因此还需要一个可以发送HTTP请求并检查HTTP响应的组件。

浏览Packagist后,我们找到guzzlehttp/guzzle和league/csv两个组件,前者用于处理HTTP消息,后者用于处理CSV数据。下面我们在项目最顶层运行如下命令:composer require guzzlehttp/guzzle

composer require league/csv

Composer会将依赖安装到根目录的vendor目录下,安装完成后,会在根目录下生成composer.json和composer.lock文件:

199c212a4c96db95959360757a76bf32.png

composer.lock文件中会列出项目使用的所有PHP组件,以及组件的具体版本号,这其实是锁定了项目,让项目只能使用具体版本的PHP组件。这样的好处是,composer会下载这个文件中列出的具体版本,而不管Packagist中可用的最新版本是多少,你应该把composer.lock文件纳入版本控制,这样让团队成员使用的PHP版本和你一样,如果本地开发和服务器使用的PHP组件版本相同,可以尽量降低由组件版本不同导致的bug。

如果确实要下载最新版本的组件并更新composer.lock,可以使用composer update命令。

自动加载

接下来我们来编写应用代码,在根目录下创建一个scan.php文件,然后在该文件顶部使用require导入Composer创建的自动加载器:require 'vendor/autoload.php';

Composer创建的自动加载器其实就是个名为autoload.php的文件,保存在vendor目录中,Composer下载各个PHP组件时,会检查每个组件的composer.json文件,确定如何加载该组件,得到这个信息后,Composer会在本地为该组件创建一个符合PSR标准的自动加载器。这样我们就可以实例化项目中的任何PHP组件,这些组件按需自动加载。

编写代码

下面我们正式使用Guzzle和CSV组件编写scan.php代码://使用composer自动加载器

require 'vendor/autoload.php';

//实例Guzzle Http客户端

$client = new GuzzleHttp\Client();

//打开并迭代处理CSV

$csv = League\Csv\Reader::createFromPath($argv[1]);

foreach ($csv as $csvRow) {

try {

//发送HTTP GET请求

$httpResponse = $client->get($csvRow[0]);

//检查HTTP响应的状态码

if($httpResponse->getStatusCode() >= 400) {

throw new Exception();

}

} catch (Exception $e) {

//把死链发给标准输出

echo $csvRow[0] . PHP_EOL;

}

}

下面我们在urls.csv中添加一些URL,一行一个,而且至少有一个是死链:

1b94f900527db9229358a7f56998a08e.png

然后打开终端,执行scan.php脚本:php scan.php urls.csv

我们传入了两个参数,第一个是脚本文件scan.php的路径,另一个是CSV文件的路径。输出如下:

29607cd60a12b04ff8ff43c8dd386aa1.png

相关教程:PHP视频教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

{转}maven+continuum安装与配置

为什么80%的码农都做不了架构师?>>> 一、下载 1. maven: 项目管理工具,可以进行项目的编译、测试、布置、发布等 下载路径:http://apache.etoak.com/maven/binaries/apache-maven-2.2.1-bin.zip 2. continuum: 基本实现的功能&…

六种方法,做一名更好的开发者

六种方法,做一名更好的开发者2008-12-13 23:381. 交谈 尽可能多地跟其他软件开发者交谈;培养个人关系;跟意见与你相左的人交流;跟经验更丰富的人交流;跟阅历丰富的人交流。多到Groups 中去,尤其是交谈…

.net Excel导出出现乱码及excel打开出现错误提示

测试人员测试发现。导出excel出现乱码以及出现文件可正常导出、后几次导出却异常。 使用的系统浏览器: 其他360浏览器、谷歌浏览器均正常。 出现情况如下: 查资料发现,之前导出代码编写的 Response.AppendHeader("Content-Disposition&q…

stract oracle,ORACLE 字符串聚合函数 strCat

源码如下:create or replace type strcat_type as object(currentstr varchar2(4000),currentseprator varchar2(8),static function ODCIAggregateInitialize(sctx IN OUT strcat_type) return number,member function ODCIAggregateIterate(self IN OUT strcat_ty…

您请求的报表需要更多信息...

ASP.NET水晶报表心得: 我建立好的的报表,在本机测试通过,可是一发布就出现这个提示:"您请求的报表需要更多信息...".这个问题郁闷死我了,困扰了我好一阵,说句心里话,还没有解决,在网上了也搜索了,但是没有解决我所遇到的问题,我采取了一个折中的办法去处理. 首先说一…

rsync推拉模型及结合inotify实现推模型自动同步

一、前言 无论使用什么操作系统下,都经常有同步文件的需求,不管发生在本地,还是发生在本地和远程主机之间。那么应该怎么做呢? 使用拷贝类的命令,本地使用cp命令,复制到远程主机使用scp这样的命令&#xff…

数据库设计:三范式

第一范式:确保每列的原子性. 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。第二范式:在第一范式的基础上更进一层,目标是确保表…

oracle to pgsql,PostgresToOracle

PostgresToOracle官方版是一款十分专业和实用的PostgreSQL数据库迁移到Oracle工具,PostgresToOracle官方版功能出色,操作便捷,能够轻松快捷的帮助大家将PostgreSQL数据导入到oracle数据中,导入之后可以进行数据编辑,此…

资源下载列表

赵昱的博客:http://blog.zhaoyu.me/ 新托福考位助手:1.0.0 Beta2 | Download :新托福考位助手 (601) | 更新记录 Icyplayer Library C#:1.0.0 | Download:Icyplayer Library C# (522) | 更新记录 转载于:https://www…

Struts2中的OGNL详解

2019独角兽企业重金招聘Python工程师标准>>> 首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取…

oracle exacc,【学习笔记】Oracle 11GR2新特性Adaptive Cursor Sharing(ACS)

天萃荷净Oracle研究中心学习笔记:分享一篇关于Oracle 11.2.0.1 11Gr2数据库最新版本中最新特性Adaptive Cursor Sharing(ACS)深入研究笔记。本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger 的Oracle技术博客本…

鼠标屏幕取词-技术

二、小故事串起来,就是秘密所在 别以为刚才那几个小故事都是杂乱无章地堆在一起,只要你把它们看明白了,那取词的秘密也就大白于天下了。让我们看看词霸在几个小故事中各扮演了什么角色…… 1.获得鼠标当前位置 通过HOOK机制钩住系统中的鼠标消…

C# 之 HttpResponse 类

Response 对象,派生自HttpResponse 类,该类封装来自 ASP.NET 操作的 HTTP 响应信息。存在于System.Web命名空间下。 注:MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型就是设定某种扩展名的文件用一种应用程序来打开的…

oracle时间类型插入,oracle 插入时间字符串 Date类型

和MysqL不同,MysqL 可以直接插入 时间字符串的,UPDATE HR_EFF_EVALUATORSET LEVEL_ 2,ROLE_NAME_ 他评,ASSESS_ROLE_ 具体人员,ASSESS_WAY_ 10,WEIGHT_ 百分制,NOTE_ 欧敏测试,PLAN_ID_ 110001231000002,STATUS_ 0,CREATE_TIME_TO_DATE(2016-12-…

esper(4-3)-Non-Overlapping Context

语法 create context context_name start start_condition end end_condition 如: // 9点到17点此context才可用(以引擎的时间为准)。如果事件进入的事件不在此范围内,则不受该context影响 create context NineToFive start (0,…

牢骚贴

如果你不是在科研机构工作,抑或你不是自己做自己的项目,那么或许你会有我一样的情况。 老总要的是效率、效率、效率。。。。。。还是效率。他不管你用了什么oo或者设计技巧,他要的是在最短的时间完成项目,至于这个项目的可维护性、…

11个实用的CSS学习工具

为什么80%的码农都做不了架构师?>>> 1. 盒子模型的幻灯片 通过3D转换效果产生的互动的幻灯片。按向左或向右箭头键切换,全屏观看会有更好的效果。 2. CSS Diner 通过一个简单的小游戏让你学习CSS selector,输入正确的selector来完…

linux什么用户什么任务,Linux 用户

查看所有用户cat /etc/passwd查看linux下用户组cat /etc/group用cat /etc/passwd |cut -f 1 -d :系统默认用户 http://zhidao.baidu.com/question/133424460Linux 用户user和用户组group管理 概念主要讲在Linux 系统中用户和用户组管理的概念,相关命令;对单用户多任…

使用字符缓冲流读取数据

package text;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException; public class Buff5 { public static void main(String[] args) {          BufferedReader bosnull;          try {//      …

Google 节日徽标全集 (1999-2009) (下)

这是 Google 节日徽标全集的第三部分,也是最后一部分,包含 Google 2006 至 2009 年 2 月全部节日徽标。需要指出的是,这些徽标均来自 Google 国际站点,也就是 www.google.com,Google 在众多本地站点上还有大量本土化的…