eloquent / cosmos
一个用于表示和操作 PHP 类名的库。
Requires
- php: >=5.3.0
- eloquent/equality: ~2
- icecave/isolator: ~2
Requires (Dev)
- icecave/archer: ~0.2
This package is auto-updated.
Last update: 2020-02-06 04:45:10 UTC
README
一个用于表示和操作 PHP 类名的库。
安装
作为 Composer 包 eloquent/cosmos 提供。
什么是 Cosmos?
Cosmos 是一个用于表示和操作 PHP 类名的库。它包括一个 ClassName
对象,以及帮助解决类名与一系列 namespace
和 use
语句的工具。
ClassName 对象
该对象旨在表示任何有效的 PHP 类或命名空间名称。创建一个新的 ClassName
对象有两种方式:从字符串或从表示类名部分的数组(或称为“原子”)中创建。不能直接实例化 ClassName
对象。
以下演示了两种方法
use Eloquent\Cosmos\ClassName; $earth = ClassName::fromString('\MilkyWay\SolarSystem\Earth'); $mars = ClassName::fromAtoms(array('MilkyWay', 'SolarSystem', 'Mars'), true);
注意 fromAtoms()
方法中的第二个参数。此布尔值确定类名是否为绝对类名(以命名空间分隔符开头)。
从这里,可以使用 ClassName
对象来操作类名或提取关于其组成部分的信息。
ClassName::atoms()
返回类名部分作为字符串数组。
ClassName::isAbsolute()
如果类名是绝对类名(以命名空间分隔符开头)则返回布尔值 true,否则返回布尔值 false。
ClassName::isShortName()
如果类名不是绝对类名并且只有一个原子,则返回布尔值 true。如果这些条件不满足,则返回 false。
ClassName::isEqualTo(ClassName $className)
如果提供的类名与当前类名完全相等,则返回布尔值 true。提供的类名必须具有相同的原子,并且与当前类名的绝对性匹配。
ClassName::isRuntimeEquivalentTo(ClassName $className)
如果提供的类名在运行时与当前类名等价,则返回布尔值 true。提供的类名必须具有相同的原子,但绝对类名和相对类名在 PHP 运行时被同等对待。
ClassName::join(ClassName $className)
将 $className
追加到当前类名末尾,并返回作为新 ClassName
对象的结果。请注意,绝对类名不能被连接。
ClassName::joinAtoms($atom, ...)
将提供的原子追加到当前类名末尾,并返回作为新 ClassName
对象的结果。
ClassName::joinAtomsArray(array $atoms)
将提供的原子数组附加到类名末尾,并返回新的ClassName
对象。
ClassName::hasParent()
如果类名具有父命名空间,则返回布尔值true;如果没有,则返回布尔值false。
ClassName::parent()
返回此类名的父命名空间作为新的ClassName
对象。
ClassName::shortName()
返回此类名的最后一个原子作为新的ClassName
对象。
ClassName::toAbsolute()
返回此类名的绝对版本作为ClassName
对象。如果此类名已经是绝对路径,则将简单地返回自身。
ClassName::toRelative()
返回此类名的相对版本作为ClassName
对象。如果此类名已经是相对路径,则将简单地返回自身。
ClassName::hasDescendant(ClassName $className)
如果此类名是$className
的父命名空间之一,则返回布尔值true;如果不是,则返回布尔值false。
ClassName::stripNamespace(ClassName $namespaceName)
从类名中删除$namespaceName
,并返回相对于提供命名空间名称的新ClassName
对象。
ClassName::exists($useAutoload = true)
如果类名存在,则返回布尔值true。请注意,这并不考虑类名是绝对路径还是相对路径。可以指定$useAutoload
参数以防止在必要时自动加载。
ClassName::string()
返回此类名的字符串表示形式。ClassName
还实现了__toString()
,它只是返回此方法的结果。
类名解析器
要使用类名解析器,首先创建一个新的解析器,以表示要解决的namespace
和use
语句集合。
第一个参数代表namespace
语句。它必须作为完全限定的ClassName
对象提供。第二个参数是一个表示use
语句的元组数组。
如果提供了一个1元组,它表示没有as
子句的use
语句。一个2元组表示带有附加as
子句的use
语句。元组的第一个元素始终是一个完全限定的ClassName
对象。如果存在,第二个元素必须是一个简短的ClassName
对象。也就是说,它不包含任何命名空间分隔符。
use Eloquent\Cosmos\ClassName; use Eloquent\Cosmos\ClassNameResolver; $resolver = new ClassNameResolver( ClassName::fromString('\MilkyWay\SolarSystem'), // namespace array( array( ClassName::fromString('\MilkyWay\AlphaCentauri\ProximaCentauri'), // use ), array( ClassName::fromString('\Andromeda\GalacticCenter'), // use ClassName::fromString('Andromeda'), // as ), ) );
上述解析器类似于以下PHP代码
namespace MilkyWay\SolarSystem; use MilkyWay\AlphaCentauri\ProximaCentauri; use Andromeda\GalacticCenter as Andromeda;
创建的解析器现在可以用来确定任何类名的规范版本。请注意,在下面的示例中,返回的是ClassName
对象,而不是普通字符串。
echo $resolver->resolve(ClassName::fromString('Earth')); // outputs '\MilkyWay\SolarSystem\Earth' echo $resolver->resolve(ClassName::fromString('ProximaCentauri')); // outputs '\MilkyWay\AlphaCentauri\ProximaCentauri' echo $resolver->resolve(ClassName::fromString('Andromeda')); // outputs '\Andromeda\GalacticCenter' echo $resolver->resolve(ClassName::fromString('TNO\Pluto')); // outputs '\MilkyWay\SolarSystem\TNO\Pluto' echo $resolver->resolve(ClassName::fromString('\Betelgeuse')); // outputs '\Betelgeuse'