在插件中使用全局变量

时间:2013-09-26 作者:David Garcia

我正在创建我的第一个插件,我发现自己不得不在同一页的不同部分调用相同的选项变量,因此我寻求解决方案,偶然发现全局变量似乎对我有用,然而在阅读了几篇文章后,人们似乎反对使用全局变量,而且我也不完全确定我是否正确使用了它们。

这就是我所拥有的;

/************************
* Variables
************************/
global $bClass, $cClass, $dClass, $cExpiry;
       $bClass = $cClass = $dClass = $cExpiry =  get_option(\'myoption\');
然后,由于我使用一个选项将相关变量保存在一个数组中,所以我会像这样回显值

jquery

expires: <?php global $cExpiry; echo $cExpiry[\'cExpiry\']; ?>,
然后我还会在同一页面的其他功能中使用它。

所以,这对我来说是可行的,但我仍然想知道我是否做对了。

update感谢大家的解释,我最终使用了局部变量,并且在代码中发现了一个错误;

因为我把所有变量都保存在一个选项中,所以我只使用了一个局部变量;

$options = get_option(\'myoption\');
然后我将通过将变量放在括号内来访问数组

<?php echo $options[\'var1\']; ?>
而在我之前$bClass = $cClass = $dClass = $cExpiry = get_option(\'myoption\'); 这很糟糕。

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

有比这更简单的方法。正如@Wyck已经指出的,使用globals是个坏主意,这里有一个简短的解释,以及如何:

为什么globals不好:

1)每个人都可以在任何地方访问它们。首先,这听起来不错,但您也可以执行以下操作:

// Your code: default value
global $foo;
$foo = \'bar\';

// User setting:
global $foo;
$foo = get_option( \'baz\' );

// Later in your code
if ( \'bar\' === $foo )
    // do something important

// Now I, the end user, do this in a template
// or Ernie, the novice developer, does this in his 3rd party plugin:
$GLOBALS[\'foo\'] = 42;
突然间,一切都不如预期。很简单:全局变量可以被截获。他们不是没有冲突的,没有人可以ever 确保它们包含的内容。

2) 当你知道他们可以在飞行中改变后,你就会知道他们unpredictable. 如果您想用IDE追溯它们(例如PHPStorm、Eclipse/Aptana等),那么您永远无法找到它们的来源或者它们的确切更改位置。。。除非你坐了很长一段时间,使用断点和XDebug之类的东西,并了解自己的方法。

3) 我真的需要写更多吗?我想不是。

结论:由于大多数选项都是自动加载的,因此它们已经出现在每个页面/请求中,不需要包装在全局中。简单呼叫get_option() 只要你需要它。

如何将数据从PHP移动到JSwp_localize_script()

示例:(可用于login_enqueue_scriptsadmin_enqueue_scripts 挂钩)

add_action( \'wp_enqueue_scripts\', \'wpse115840_scripts\' );
function wpse115840_scripts()
{
    wp_enqueue_script( \'wpse_handle\', etc... );
    // Here goes the magic:
    wp_localize_script( \'wpse_handle\', \'wspeObject\', array(
        \'foo\' => \'bar\',
        \'bar\' => get_option( \'baz\' )
    ) );
}
现在,您可以访问wp_localize_script() javascript文件中的数组(第三个参数),您只需调用wpseObject. 下面的示例现在将为您提供值bar:

console.log( wpseObject.foo );
还有你的wpseObject.bar 会让你baz 设定值。

结束

相关推荐

hooks & filters and variables

我是updating the codex page example for action hooks, 在游戏中完成一些可重用的功能(最初是针对这里的一些Q@WA)。但后来我遇到了一个以前没有意识到的问题:在挂接到一个函数以修改变量的输出后,我再也无法决定是要回显输出还是只返回它。The Problem: 我可以修改传递给do_action 用回调函数钩住。使用变量修改/添加的所有内容仅在回调函数中可用,但在do_action 在原始函数内部调用。很高兴:我将其修改为一个工作示例,因此您可以将其复制/粘贴