eloquent/cosmos

该包已被废弃,不再维护。未建议替换包。

一个用于表示和操作 PHP 类名的库。

2.3.1 2013-03-04 09:26 UTC

This package is auto-updated.

Last update: 2020-02-06 04:45:10 UTC


README

一个用于表示和操作 PHP 类名的库。

Build Status Test Coverage

安装

作为 Composereloquent/cosmos 提供。

什么是 Cosmos?

Cosmos 是一个用于表示和操作 PHP 类名的库。它包括一个 ClassName 对象,以及帮助解决类名与一系列 namespaceuse 语句的工具。

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(),它只是返回此方法的结果。

类名解析器

要使用类名解析器,首先创建一个新的解析器,以表示要解决的namespaceuse语句集合。

第一个参数代表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'