定义主题和插件路径和网址的最佳方式


8

我一团糟。我知道这是一个愚蠢的问题。您看到主题路径不太好,还有其他方法吗?我该如何使用get_template_directory()

    // theme folder path
    if ( ! defined( 'TZSC_THEME_DIR' ) ) {
        define( 'TZSC_THEME_DIR', dirname(__FILE__).'/' );
    }

    // theme folder URL
    if ( ! defined( 'TZSC_THEME_URL' ) ) {
        define( 'TZSC_THEME_URL', plugin_dir_url( __FILE__ ) );
    }

1
为什么需要常量?它们在您的代码中创建了对全局状态的附加依赖关系。这真是太糟了。
fuxia

因此,您建议我不要使用这些?谢谢。这会影响我的页面加载时间吗?
ashraf 2014年

2
从PHP 5.4开始,将常量放在堆栈的末尾,因此可以更快地读取它们。但是这里真正的问题是代码质量:每当一个函数或类使用该常量时,它们“就会了解太多”,便会在自己的代码之外对状态做出假设。这是不好的。它破坏了封装并使代码难以阅读。WordPress对全局状态的依赖已经很糟糕了。不要使您的代码更糟。
fuxia

Answers:


13

请勿为此使用常量。根本不要使用全局常量。

常量有两种类型:类/接口常量和全局常量。

类或接口中的常量很好,有时很有用。过于简单的示例:

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()父主题。两者都可以在运行时进行过滤,因此您可以一次运行所有测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.