根据字符串常量获取变量值

时间:2013-03-15 作者:JimmyPena

在我的插件中,我定义了一个常量,如下所示:

define(\'DEFAULT_NUM\', 5);

我还定义了一个常量,表示要引用此数字的名称:

define(\'DEFAULT_NUM_NAME\', \'numitems\');

我的插件有一个使用以下值的短代码:

function do_something($atts) {
  extract( shortcode_atts( array(
      DEFAULT_NUM_NAME => DEFAULT_NUM
      ), $atts ) );
我这样做是为了在一个地方更改变量值,而不是对其进行硬编码:

function do_something($atts) {
  extract( shortcode_atts( array(
      \'numitems\' => 5
      ), $atts ) );
Theextract 函数将字符串“numitems”转换为一个名为$numitems. 因此,我的其余代码必须如下所示:

if ($numitems == 5) {
 return \'blah blah\';
}
实际上,我是在硬编码变量的名称,因为我必须使用我定义的任何名称。我想检索变量的值,而不必使用它。

换句话说,我想利用常量名称来确定传递给插件的值,而不必使用变量。

这可能吗?还是我的方法错了?

(仅供参考,这是一个基于实际插件的测试用例。这些不是实际的变量名。)

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

你可以这样做,但你不应该:

保持全局命名空间干净。全局命名空间中的每个名称都是冲突候选。使变量成为全局变量、常量或函数会增加冲突的可能性,无论您的prefixes

  • Constants are the slowest 全局类型。是的,这是微观优化,但既然有更好的选择,为什么还要引入它呢?

    常量不灵活。假设您将您的短代码回调更改为接受两个参数。或者五个。或者十个。您的代码将很快变得非常丑陋。

    备选方案在单独的功能中提供默认值:

    function my_plugin_prefix_get_default_shortcode_attributes()
    {
        return array (
            \'numitems\' => 5
        );
    }
    
    现在,您可以从任何位置访问这些默认值,并且可以轻松地扩展阵列。

    在您的短代码中:

    $attribute = shortcode_atts( 
        my_plugin_prefix_get_default_shortcode_attributes(),
        $atts
    );
    
    将函数移到插件的主类或单独的类中:
    class My_Plugin
    {
        public static function get_default_shortcode_attributes()
        {
            return array (
                \'numitems\' => 5
            );
        }
    }
    
    在您的短代码中:

    $attribute = shortcode_atts( 
        My_Plugin::function get_default_shortcode_attributes(),
        $atts
    );
    

  • 结束

    相关推荐

    Wrap text around shortcode

    我在插件中使用了一个短代码处理程序。短代码可以有不同的(可选)参数。例如,可以在静态WordPress页面上使用两个短代码,在短代码之前、之间和之后都有文本。例如: Lorem ipsum dolor sit amet, consetetur sadipscing elitr <table> <tr> <td>[shortcode option=\"1\"]</td>&#