不要为此使用常量。完全不要使用全局常量。
常量有两种类型:类/接口常量和全局常量。
类或接口中的常量很好,有时很有用。一个过于简单的例子:
interface Requirements
{
const MIN_PHP_VERSION = 5.4;
public function php_is_good();
}
class Theme_Requirements implements Requirements
{
public function php_is_good()
{
return version_compare( PHP_VERSION, self::MIN_PHP_VERSION, \'>=\' );
}
}
但请记住,这些常量总是公共的。如果以后更改它们,可能会破坏依赖于它们的代码。
全局常量的情况更糟。设想如下:
define( \'THEME_URI\', get_template_directory_uri() );
然后是默认标题图像的函数:
function get_default_header_image()
{
return THEME_URI . \'/img/default-header.jpg\';
}
这个函数对一些超出其控制范围的内容进行假设,因为它知道的太多了。如何使用常数的不同值测试该函数?你不能。
假设您想测试将常量设置为不存在的目录或另一个较慢的服务器时会发生什么。但一旦定义了常量,就不能更改其值。您不能一下子运行所有测试,这使得测试变得非常困难。
在一个试图使用自己默认图像的子主题中,您如何实现这一点?常量由父主题设置。您可以使用添加支票defined()
, 但这使得我们更难看到它的价值实际上是写在哪里的。
最好将函数重写为:
function get_default_header_image( $base )
{
return esc_url( $base ) \'/img/default-header.jpg\';
}
我之前说过,常量是一个API。API应该很容易更改,但很难拒绝常量,因为PHP不记录访问。因此,除非其他开发人员非常仔细地阅读您的源代码或文档,否则您的反对消息永远不会传到他们那里。相信我,他们不会的。
使用get_stylesheet_directory_uri()
在儿童主题和get_template_directory_uri()
在父主题中。这两个测试都可以在运行时过滤,所以您可以一次运行所有测试。