示例代码:
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。它是这样工作的。但我不知道为什么我应该这样使用它。
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\');
});