PHP常量在不同的包中冲突

时间:2018-02-21 12:10:59

标签: php path autoload

我正在研究一个敏捷的PHP项目,该项目分为几个库和插件,并使用composer自动加载。我遇到的问题是我对每个库都有几乎相同的配置文件,如下所示:

<?php

 define('ROOT', __DIR__); // root dir
 define('APP', ROOT . DS . 'app'); // app directory

在我的所有包中都有这样的东西,这会产生常量冲突。

那么我怎样才能做一些更清洁的事情,其中​​每个软件包都有自己的路径链接,而不会与其他软件包以及composer软件包产生任何冲突。< / p>

2 个答案:

答案 0 :(得分:1)

您可以使用namespacesclass constants来解决此问题。

例如:

利巴

<?php 

namespace libraryA;

class Config
{
    const ROOT = __DIR__;
    const DS = '/';
    const APP = self::ROOT . self::DS . 'appA';
}

LibB:

<?php 

namespace libraryB;

class Config
{
    const ROOT = __DIR__;
    const DS = '/';
    const APP = self::ROOT . self::DS . 'appB';
}

您可以在任何地方轻松访问:

<?php

use libraryA\Config as AConfig;
use libraryB\Config as BConfig;


var_dump(AConfig::APP, BConfig::APP);

这样它们将保持独立,并且代码更具可读性 这只是一个示例,您不必为每个配置类重新声明DSROOT。你可以使用1个父类来包含这些全局常量。

答案 1 :(得分:0)

PHP中实际上有三种类型的用户定义常量:

  • 使用define()声明的全局常量,它在所有范围内具有相同的值。这些应该谨慎使用,因为正如您所发现的那样,很容易最终得到两段代码来尝试定义相同的常量。但是,您可以检查常数是否已经存在,如果您确定它在两个地方都用于相同目的,例如if ( ! defined('MAGIC') ) { define('MAGIC', 'xyzzy'); }
  • 类常量,在类定义中使用const声明,并使用语法ClassName::FOO进行访问。这些更明确地限定范围,并且由于类可以自动加载,因此您不需要显式include具有定义的文件。该类可以反过来位于命名空间中,以便在包之间进行额外的分离。但是,您可以根据以下内容定义它们,例如:与define()不同,它们不能是函数调用的结果。
  • 命名空间常量,在const中在顶部有namespace声明的文件中声明。可以使用Foo\Bar\MAGICuse const Foo\Bar\MAGIC使用use const Foo\Bar\MAGIC as BAR_MAGICinclude来使用完全限定名称引用这些名称。它们可以让你不得不创建一个空的类来放置你的常量,但遗憾的是无法自动加载,所以你仍然需要明确地<img *ngFor="let picture of pictures" [src]="picture.path"> 一个文件来定义它们。