我正在研究一个敏捷的PHP项目,该项目分为几个库和插件,并使用composer自动加载。我遇到的问题是我对每个库都有几乎相同的配置文件,如下所示:
<?php
define('ROOT', __DIR__); // root dir
define('APP', ROOT . DS . 'app'); // app directory
在我的所有包中都有这样的东西,这会产生常量冲突。
那么我怎样才能做一些更清洁的事情,其中每个软件包都有自己的路径和链接,而不会与其他软件包以及composer软件包产生任何冲突。< / p>
答案 0 :(得分:1)
您可以使用namespaces和class 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);
这样它们将保持独立,并且代码更具可读性
这只是一个示例,您不必为每个配置类重新声明DS
和ROOT
。你可以使用1个父类来包含这些全局常量。
答案 1 :(得分:0)
PHP中实际上有三种类型的用户定义常量:
define()
声明的全局常量,它在所有范围内具有相同的值。这些应该谨慎使用,因为正如您所发现的那样,很容易最终得到两段代码来尝试定义相同的常量。但是,您可以检查常数是否已经存在,如果您确定它在两个地方都用于相同目的,例如if ( ! defined('MAGIC') ) { define('MAGIC', 'xyzzy'); }
const
声明,并使用语法ClassName::FOO
进行访问。这些更明确地限定范围,并且由于类可以自动加载,因此您不需要显式include
具有定义的文件。该类可以反过来位于命名空间中,以便在包之间进行额外的分离。但是,您可以根据以下内容定义它们,例如:与define()
不同,它们不能是函数调用的结果。const
中在顶部有namespace
声明的文件中声明。可以使用Foo\Bar\MAGIC
或use const Foo\Bar\MAGIC
使用use const Foo\Bar\MAGIC as BAR_MAGIC
或include
来使用完全限定名称引用这些名称。它们可以让你不得不创建一个空的类来放置你的常量,但遗憾的是无法自动加载,所以你仍然需要明确地<img *ngFor="let picture of pictures" [src]="picture.path">
一个文件来定义它们。