当前位置: 首页 > 后端技术 > PHP

【PHP入门系列】4-PHP命名空间与包管理

时间:2023-03-29 14:34:30 PHP

在现代PHP项目中,OOP开始流行起来。随着生态的不断扩大,也带来了项目管理的问题。命名空间和包管理已经是实际项目中必不可少的组件。命名空间什么是命名空间?从广义上讲,命名空间是一种封装事物的方式。这种抽象可以在很多地方看到。例如,目录在操作系统中用于对相关文件进行分组,它充当目录中文件的名称空间。例如,文件foo.txt可以同时存在于/home/greg和/home/other目录下,但两个foo.txt文件不能存在于同一个目录下。另外,访问/home/greg目录外的foo.txt文件时,必须在文件名前加上目录名和目录分隔符,才能得到/home/greg/foo.txt。将这一原则应用到编程领域就是命名空间的概念。在PHP中,命名空间用于解决在编写类库或应用程序时创建类或函数等可重用代码时遇到的两类问题:用户编写的代码与PHP内部类/函数/常量或第三方类之间的名称冲突/功能/常量。为非常长的标识符名称(通常定义为缓解第一类问题)创建别名(或简称),提高源代码的可读性。PHP名称空间提供了一种将相关的类、函数和常量组合在一起的方法。因此,将您的代码放在您的命名空间下非常重要,以避免其他开发人员担心与第三方库发生冲突。PSR-4提供了一种使用命名空间的推荐方式,它提供了标准的文件、类和命名空间使用约定,从而允许代码即插即用。如果你在新的应用程序或扩展中使用自动加载标准,PSR-4应该是首选。基本名称空间是用关键字名称空间声明的。如果一个文件包含命名空间,它必须在所有其他代码之前声明命名空间,除了一个:declare关键字。访问当前命名空间内元素的方法,__NAMESPACE__魔术常量和命名空间关键字。如果通过运算符use使用命名空间的类没有定义任何命名空间,那么类和函数的所有定义都在全局空间中,这与PHP引入命名空间概念之前是一样的。在名称前加上\表示该名称是全局空间中的名称,即使该名称在另一个名称空间中也是如此。包管理PHP有许多可用的库、框架和组件。目前,PHP有两个应用广泛的包管理系统Composer和PEAR。Composer是PHP最流行的包管理器,受益于命名空间和自动加载,通过Composer您可以随时在您的项目中使用第三方优秀项目。Composer有点像Node.js世界中的NPM。可以从官网查看完整的安装过程:官方地址,如果你在中国,可能需要国内加速镜像中国全镜像AlibabaCloudComposer全镜像Composer是一款优秀的依赖管理器。在composer.json文件中列出你的项目需要的依赖,通过几个简单的命令,Composer会自动为你下载并设置你的项目依赖。完整学习可以查看官方文档,或者国内翻译文档composer中文文档composer.jsonsetting{"require":{"monolog/monolog":"1.0.*"}}可以看到require需要一个映射到包版本(例如1.0.*)的包名称(例如monolog/monolog)对象。包版本约束可以用几种不同的方式指定。名称实例描述了确切的版本号1.0.2你可以指定包的确切版本范围>=1.0>=1.0,<2.0>=1.0,<1.1丨>=1.2你可以通过使用指定有效的版本范围比较运算符。有效运算符:>、>=、<、<=、!=。您可以定义多个范围,以逗号分隔,这将被视为逻辑与。管道符号|将被视为逻辑或。AND的优先级高于OR。通配符1.0.*您可以使用通配符*来指定模式。1.0.*相当于>=1.0,<1.1。赋值运算符~1.2这对于遵循SemVering的项目很有用。~1.2相当于>=1.2,<2.0。要了解更多信息,请阅读下一节。下一个大版本(波浪符运算符)~最好用一个例子来解释:~1.2相当于>=1.2,<2.0,~1.2.3相当于>=1.2.3,<1.3。安装依赖包要获取本地项目定义的依赖项,只需调用composer.phar并运行安装命令:phpcomposer.pharinstall将在项目的根目录下创建一个composer.lock文件并下载第三方代码到指定的目录供应商。composer.lock文件,这将锁定项目的特定版本。这意味着如果您的依赖项更新为较新的版本,您将不会获得任何更新。此时要更新您的依赖版本,请使用更新命令:phpcomposer.pharupdateAutoloading对于库自动加载信息,Composer生成一个vendor/autoload.php文件。您可以简单地导入此文件,您将免费获得自动加载支持。你甚至可以在composer.json中添加一个自动加载指令来添加你自己的自动加载声明{..."autoload":{"psr-4":{"Acme\\":"src/"}}}命令Composer命令行工具可以通过composerhelp获得帮助。下面是一些常用的命令和参数composerrequireparameter--dev:给require-dev添加依赖。--prefer-source:如果可能,从源安装。--prefer-dist:尽可能从发行版安装。--no-progress:去掉进度条的显示,避免和一些不支持退格字符的终端或脚本冲突。--no-suggest:跳过输出中建议的依赖项。--no-update:禁用依赖项的自动更新。--no-scripts:跳过执行composer.json中定义的脚本。--update-no-dev:使用--no-dev选项执行依赖更新。--update-with-dependencies:更新最近引入的依赖,不包括根依赖。--update-with-all-dependencies:更新最近引入的依赖,包括根依赖。--ignore-platform-reqs:忽略php、hhvm、lib-*和ext-*依赖项并强制安装,即使本地机器不完全支持这些功能。详情见平台。详情见平台。--prefer-stable:首选稳定版本。--prefer-lowest:首选最低版本。在测试依赖项的最低版本时很有用,通常与--prefer-stable结合使用。--sort-packages:保持依赖项在composer.json中排序。--optimize-autoloader(-o):将PSR-0/4自动加载器转换为类映射以加快加载速度。生产环境建议这样做,但是执行起来比较费时间,所以默认关闭。--classmap-authoritative(-a):仅从类映射中自动加载类名。需要启用--optimize-autoloader。--apcu-autoloader:使用APCu来缓存找到和未找到的类名。常用的composerinstall参数有--prefer-source:下载扩展包有两种方式:源代码版本和可执行版本。对于稳定版本,Composer默认使用可执行文件。源版本来自于版本控制工具。如果启用--prefer-source,Composer将安装源版本。这里有一个小技巧,如果你想修复一个错误,那么直接从依赖项中克隆一个本地存储库。--prefer-dist:与--prefer-source相反,如果可执行文件存在,Compser将直接安装它。这将在不更新供应商的情况下加速服务器上的构建。你没有安装正确,git克隆扩展包也是一种方式。--dry-run:如果要指定运行时不安装某个扩展包,可以使用--dry-run。这会模拟安装并提示可能出现的问题。--dev:安装require-dev中的扩展列表(默认执行)。--no-dev:跳过require-dev中的扩展列表。.autoload-dev规则在自动加载中被跳过。--no-autoloader:跳过自动加载器。--no-scripts:跳过composer.json中声明的脚本。--no-progress:去除进度显示,部分命令或脚本不处理退格字符,造成显示混乱。--no-suggest:跳过扩展包建议。--optimize-autoloader(-o):将PSR-0/4自动加载转换为类映射以获得更快的加载支持。特别推荐用于生产环境,但不是默认设置,因为它需要一些时间才能运行。--classmap-authoritative(-a):只从类图中加载类。将以--optimize-autoloader开始。--apcu-autoloader:启用APCu缓存所有类。--ignore-platform-reqs:忽略php、hhvm、lib-*和ext-*要求并强制安装,即使本地环境并不完全需要它们。平台配置选项可见常用的composerupdate--prefer-sourceofplatform:如果可能,从源码安装依赖。--prefer-dist:如果可用,从发行版安装依赖项。--dry-run:模拟执行命令而不实际进行任何更改。--dev:安装require-dev中列出的依赖项(这也是默认行为)。--no-dev:不安装require-dev中列出的依赖项。自动加载构建也会跳过autoload-dev。--lock:只更新锁文件的hash,以消除锁文件过期的警告。--no-autoloader:不生成自动加载器。--no-scripts:跳过执行composer.json中定义的脚本。--no-progress:去掉进度条的显示,避免和一些不支持退格字符的终端或脚本冲突。--no-suggest:跳过输出中建议的依赖项。--with-dependencies:将白名单中的依赖添加到白名单中,除了那些根依赖。--with-all-dependencies:将所有列入白名单的依赖项添加到白名单中,包括那些根依赖项。--optimize-autoloader(-o):将PSR-0/4自动加载器转换为类映射以加快加载速度。生产环境建议这样做,但是执行起来比较费时间,所以默认关闭。--classmap-authoritative(-a):仅从类映射中自动加载类名。需要启用--optimize-autoloader。--apcu-autoloader:使用APCu来缓存找到和未找到的类名。--ignore-platform-reqs:忽略php、hhvm、lib-*和ext-*依赖项并强制安装,即使本地机器不完全支持这些功能。详情见平台。--prefer-stable:首选稳定版本。--prefer-lowest:首选最低版本。在测试依赖项的最低版本时很有用,通常与--prefer-stable结合使用。--interactive:交互式选择要升级的依赖项,自动完成。--root-reqs:限制根依赖项的升级。