【问题标题】:Naming constants on a boilerplate class在样板类上命名常量
【发布时间】:2013-05-14 02:19:11
【问题描述】:

我正在创建一个样板类,用于我创建的每个 wordpress 插件。 (如果“样板”不是正确的调用方式,Mods 可以随意编辑)。我在所有插件和代码中都使用了一些常量,因此我正在寻找正确的命名方式。

在我的代码中我有这个:

//edit these
define( 'WPB_PREFIX'                        , 'wsm');
define( 'WPB_SLUG'                          , 'wp-simple-monitor'); // Need to match plugin folder name
define( 'WPB_PLUGIN_NAME'                   , 'WP Simple Monitor');
define( 'WPB_VERSION'                       , '1.0');
//dont edit
define( WPB_PREFIX.'_ABS_PATH'              , WP_PLUGIN_DIR . '/'. WPB_SLUG          );
define( WPB_PREFIX.'_REL_PATH'              , dirname( plugin_basename( __FILE__ ) )             );
define( WPB_PREFIX.'_PLUGIN_URL'            , WP_PLUGIN_URL . '/'. WPB_SLUG          );

class WP_Plugin_Base
    {
    // ...
    _e('Settings', WPB_PREFIX);
    // ...
    }

因此,例如,在我的代码中,我像这样使用它:

<?php _e('Settings', WPB_PREFIX);?>

到目前为止一切正常,但如果我最终在同一个项目中使用两个插件,我必须检查我的所有代码并按照已经定义的方式更改“WPB_PREFIX”。有一种简单的方法可以做到这一点而无需抛出所有代码?

谢谢

【问题讨论】:

  • 看起来你在寻找defined()函数。不? $x = defined('WPB_PREFIX') ? WPB_PREFIX : 'default';
  • 除了我在下面的回答之外,我强烈敦促您遵守标准的 PHP 代码样式,即非缩进花括号。 ;)

标签: php naming-conventions constants


【解决方案1】:

您可以(并且应该!)将它们定义为 class properties 而不是全局常量。你可以有一个基类来设置你需要访问的常量的默认值,然后扩展这个类:

class WP_Plugin_Base
{
    protected $wpbPrefix = 'wsm';
    protected $wpbSlug = 'wp-simple-monitor';
    // etc.
}

class WP_Plugin_Specific extends WP_Plugin_Base
{
    protected $wpbSlug = 'wp-plugin-specific';

    function someMethod() {
        _e('Settings', self::wpbPrefix);
        _e('Slug', self::wpbSlug);
    }
}

后一个类中方法的输出将是原始前缀,带有新的 slug。作为noted in the comments,您需要受保护的变量而不是类常量,以便能够使用连接的片段来定义事物,例如:

protected $absPath = WP_PLUGIN_DIR . '/' . $wpbSlug;
protected $relPath = dirname( plugin_basename( __FILE__ ) );
protected $pluginUrl = WP_PLUGIN_URL . '/' . $wpbSlug;

这样,每当您使用所需的特定类时,您都可以从已有的通用类中获得所有好处,但不会遇到交叉问题。

如果它已经定义,这也可以防止你试图弄清楚要做什么做什么,这也意味着只要保留默认值是有意义的,你可以:self::property 将如果您没有覆盖它,请检索基类属性。这应该可以为您提供所需的一切,并且在您使用它时不会弄乱全局命名空间。

【讨论】:

  • 是的,你可能是对的。这是最合适的。也涵盖了不断的覆盖问题。
  • 但是有一个问题,WBP_PREFIX 可能会被使用而不管任何类。 define('WBP_PREFIX', 'wsm'); class Settings{ const OWN_WBP_PREFIX = WBP_PREFIX; }.
  • 没错,但如果合理地使用类,那应该没关系。你应该做classInstance-&gt;WPB_PREFIX WP_Plugin_Specific::WPB_PREFIX。只要你实际实例化类,内部引用self,外部引用实例,就没有问题。
  • 或参考static
  • 对;他应该绝对避免静态使用它;这不会给你带来任何好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
相关资源
最近更新 更多