共计 4575 个字符,预计需要花费 12 分钟才能阅读完成。
在古代的 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。
根底
- 命名空间通过关键字 namespace 来申明。如果一个文件中蕴含命名空间,它必须在其它所有代码之前申明命名空间,除了一个以外:declare 关键字。
- 拜访以后命名空间外部元素的办法,__NAMESPACE__ 魔术常量和 namespace 关键字。
- 通过操作符 use 来应用 namespace 的类
- 如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 示意该名称是全局空间中的名称,即便该名称位于其它的命名空间中时也是如此。
包治理
PHP 有很多可供使用的库、框架和组件。目前 PHP 有两个应用较多的包管理系统 Composer 和 PEAR。Composer 是 PHP 最风行的包管理器,受害于命名空间和主动加载,通过 Composer 能够随时能够在你的我的项目中应用第三方优良的我的项目。Composer 有点相似于 Node.js 世界里的 NPM。
装置
能够从官网查看残缺的流程:官网地址, 国内的话你可能须要国内的减速镜像
- 中国全量镜像
- 阿里云 Composer 全量镜像
Composer 是一个 卓越 的依赖管理器。在 composer.json 文件中列出你我的项目所需的依赖包,加上一点简略的命令,Composer 将会主动帮你下载并设置你的我的项目依赖。残缺学习能够查看 官网文档, 或者国内的翻译文档 composer 中文文档
composer.json 设置
{
"require": {"monolog/monolog": "1.0.*"}
}
你能够看到,require 须要一个 包名称(例如 monolog/monolog)映射到 包版本(例如 1.0.*)的对象。
包版本束缚能够用几个不同的办法来指定。
名称 | 实例 | 形容 |
---|---|---|
确切的版本号 | 1.0.2 |
你能够指定包的确切版本 |
范畴 | >=1.0 >=1.0,<2.0 >=1.0,<1.1 丨 >=1.2 |
通过应用比拟操作符能够指定无效的版本范畴。无效的运算符:> 、>= 、< 、<= 、!= 。你能够定义多个范畴,用逗号隔开,这将被视为一个 逻辑 AND解决。一个管道符号 丨 将作为 逻辑 OR解决。AND 的优先级高于 OR。 |
通配符 | 1.0.* |
你能够应用通配符 * 来指定一种模式。1.0.* 与 >=1.0,<1.1 是等效的。 |
赋值运算符 | ~1.2 |
这对于遵循语义化版本号的我的项目十分有用。~1.2 相当于>=1.2,<2.0 。想要理解更多,请浏览下一大节。 |
下一个重要版本(波浪号运算符)~ 最好用例子来解释:~1.2 相当于 >=1.2,<2.0,而 ~1.2.3 相当于 >=1.2.3,<1.3。
装置依赖包
获取定义的依赖到你的本地我的项目,只须要调用 composer.phar 运行 install 命令:php composer.phar install
将创立一个 composer.lock 文件到你我的项目的根目录中,并把第三方的代码下载到一个指定的目录 vendor。composer.lock 文件,这将锁定改我的项目的特定版本。这意味着如果你的依赖更新了新的版本,你将不会取得任何更新。
此时要更新你的依赖版本请应用 update 命令:php composer.phar update
主动加载
对于库的主动加载信息,Composer 生成了一个 vendor/autoload.php 文件。你能够简略的引入这个文件,你会失去一个收费的主动加载反对。
你甚至能够在 composer.json 中增加一个 autoload 指令,来增加本人的主动加载申明
{
...
"autoload": {"psr-4": {"Acme\\": "src/"}
}
}
命令行工具
composer 命令行工具能够通过 composer help 获取帮忙。上面是罕用的一些命令以及参数
composer require 参数
- –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-*
依赖并强制装置,即便本地计算机不能齐全反对这些个性。详见 platform。详见platform
。 - –prefer-stable: 稳固版本优先。
- –prefer-lowest: 最低版本优先。测试依赖的最低版本时候很有用,个别和
--prefer-stable
联用。 - –sort-packages: 放弃
composer.json
中的依赖排列程序。 - –optimize-autoloader (-o): 转换 PSR-0/4 主动加载到 classmap 以获取更快的加载速度。很倡议在生产环境中这样做,但执行比拟耗时,所以默认是敞开的。
- –classmap-authoritative (-a): 只主动加载 classmap 中的类名。须要开启
--optimize-autoloader
。 - –apcu-autoloader: 应用 APCu 来缓存找到和没找到的类名。
罕用的 composer install 参数有
- –prefer-source: 有两种形式下载扩大包:
源代码版
和可执行版
。对于稳固版本,Composer 会默认应用可执行版
。源码版
来自版本控制工具的,如果启用了--prefer-source
,Composer 会装置源码版
。这有一个小提示,如果你想修复 bug,那么从依赖关系中,间接本地克隆一个仓库。 - –prefer-dist: 和
--prefer-source
相同,如果可执行版本
存在,Compser 会间接装置。这会放慢服务器上构建速度同时不必更新 vendor。你没有正确装置,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 autoloading 到 classmap 能够取得更快的加载反对。特地是在生产环境下倡议这么做,但因为运行须要一些工夫,因而并没有作为默认值。
- –classmap-authoritative (-a): 仅从 classmap 加载类。会附带启动
--optimize-autoloader
。 - –apcu-autoloader: 启用 APCu 来缓存所有类。
- –ignore-platform-reqs: 疏忽
php
,hhvm
,lib-*
和ext-*
要求并强制装置,就算本地环境不齐全要求。平台配置选项可见platform
罕用的 composer update
- –prefer-source: 如果能够的话从
源码
装置依赖。 - –prefer-dist: 如果能够的话从
公布
装置依赖。 - –dry-run: 模仿执行命令但事实上不做任何更改。
- –dev: 装置
require-dev
列出的依赖(这也是默认行为)。 - –no-dev: 不装置
require-dev
列出的依赖。主动加载生成也会跳过autoload-dev
。 - –lock: 只降级 lock 文件的哈希以打消 lock 文件过期的正告。
- –no-autoloader: 不生成主动加载。
- –no-scripts: 跳过执行
composer.json
中定义的脚本。 - –no-progress: 移除进度条的显示来防止和一些终端或不反对退格字符的脚本抵触。
- –no-suggest: 跳过输入中倡议的依赖。
- –with-dependencies: 增加白名单中的依赖到白名单,除了那些根依赖。
- –with-all-dependencies: 增加所有白名单中的依赖到白名单,包含那些根依赖。
- –optimize-autoloader (-o): 转换 PSR-0/4 主动加载到 classmap 以获取更快的加载速度。很倡议在生产环境中这样做,但执行比拟耗时,所以默认是敞开的。
- –classmap-authoritative (-a): 只主动加载 classmap 中的类名。须要开启
--optimize-autoloader
。 - –apcu-autoloader: 应用 APCu 来缓存找到和没找到的类名。
- –ignore-platform-reqs: 疏忽
php
,hhvm
,lib-*
和ext-*
依赖并强制装置,即便本地计算机不能齐全反对这些个性。详见platform
。 - –prefer-stable: 稳固版本优先。
- –prefer-lowest: 最低版本优先。测试依赖的最低版本时候很有用,个别和
--prefer-stable
联用。 - –interactive: 交互式的抉择哪些依赖要被降级,带主动补全。
- –root-reqs: 限度根依赖的降级。