在wp头挂接上调用的函数变为空

时间:2020-09-21 作者:Akın Ocak

示例代码:

function test_loaded() {

require_once \'file.php\';
$ins = Sample_Class::instance();

require_once \'file2.php\';

}

add_action(\'plugins_loaded\', \'test_loaded\');
在文件中。php

class Sample_Class {

public static $instance = null;

public static function instance() {
if(null == self::$instance) {
self::$instance = new Sample_Class();
}
return self::$instance;
}

public static function sample($a1) {

$a2 = get_option($a1);

return $a2;
}

}
在文件2中。php

$a3 = Sample_Class::instance();

function sample2() {
global $a3;
echo $a3->sample(\'test\');
}

add_action(\'wp_head\', \'sample2\');

function sample3() {
global $a3;
echo $a3->sample(\'test2\');
}

add_action(\'wp_footer\', \'sample3\');

问题:

示例2预期输出头部分:get\\u选项(\'test\')->;此值但$a3为输出null(我在函数中使用var\\u dump($a3)),sample3函数侧不会出现错误,输出$a3为对象。(我使用var\\u dump())

有人有什么想法吗?为什么我在使用wp\\U头钩时遇到问题。

我的解决方法是:在sample2函数中重新定义$a3,而不是使用global。它是这样工作的。但我不知道为什么我应该这样使用它。

1 个回复
SO网友:Rup

作为替代方案,您可以尝试使用$GLOBALS[\'a3\'] 在文件2中,确保其成为全局文件:

$GLOBALS[\'a3\'] = Sample_Class::instance();
我猜file2顶级作用域中当前的$a3声明不算作全局声明,因为它包含在test\\u loaded()作用域中。From the \'include\' docs (其中包括require和require\\u一次):

包含文件时,它包含的代码将继承包含文件所在行的变量范围。从那时起,调用文件中该行可用的任何变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局作用域。

因此,在包含文件的文件范围内声明的变量似乎是真正全局范围的例外。然而,我感到惊讶的是,没有一个等效的例外允许它们作为全局文件从file2访问,因为这会根据文件的包含方式改变$a3的行为。

如果您不需要$a3在file2之外是全局的,另一种选择可能是将sample2()更改为匿名闭包,其中包括带有“use”的$a3:

$a3 = Sample_Class::instance();

add_action( \'wp_head\', function() use ($a3) {
    echo $a3->sample(\'test\');
});

相关推荐

如何在Reaction JS/Gutenberg中使用wp.hooks.addAction()?

我能够成功使用wp.hooks.applyFilters() 和wp.hooks.addFilter(), 但我无法使用wp.hooks.addAction(). 但是console.log() 在某个操作的回调中运行良好。这是我的代码:import { createHooks } from \'@wordpress/hooks\'; let globalHooks = createHooks(); const Header = () => { r