我正在尝试用PHP进行操作,但我无法在usort函数中访问全局变量。
我已经将我的代码简化为骨头以显示我的意思:
$testglobal = 1;
function cmp($a, $b) {
global $testglobal;
echo 'hi' . $testglobal;
}
usort($topics, "cmp");
假设usort运行两次,我的期望是这将是输出:
hi1hi1
相反,我的输出是:
hihi
我已经阅读了手册(http://us.php.net/usort),我没有看到访问全局变量的任何限制。如果我将usort分配给我回显的变量,它输出1,因此usort肯定会成功运行(加上,所有这些都是“hi”)。
我在做一些令人难以置信的愚蠢事吗?如果没有,是否有解决方法?
答案 0 :(得分:2)
无法重现“错误”,也无法使用键盘:http://codepad.org/5kwctnDP
您也可以使用对象属性而不是全局变量
<?php
class Foo {
protected $test = 1;
public function bar($a, $b) {
echo 'hi' . $this->test;
return strcmp($a, $b);
}
}
$topics = array(1,2,3);
$foo = new Foo;
usort($topics, array($foo, 'bar'));
答案 1 :(得分:2)
我在我的问题中输入的代码被放在bbPress的模板中,bbPress是Wordpress的论坛表兄弟。一位朋友告诉我:“如果在定义变量之前没有对变量进行全局变量,PHP会发生奇怪的行为,具体取决于代码在执行时的嵌套方式 - bbPress会在模板输出时执行一些复杂的包含。” p>
所以我尝试了它并且它有效:
global $hi123;
$hi123 = ' working ';
我正在回答我自己的问题,以防像我这样的另一个白痴在Google搜索中发现这个问题。 : - )
我会接受VolkerK的答案,因为对象的解决方法非常聪明。
答案 2 :(得分:1)
如果使用超全局$GLOBALS
数组访问变量,它是否有效?
$testglobal = 1;
function cmp($a, $b) {
echo 'hi' . $GLOBALS['testglobal'];
}
usort($topics, "cmp");
答案 3 :(得分:0)
从php 5.2.4开始工作
$testglobal = ' WORKING ';
$topics = array('a','b','c');
function cmp($a, $b) {
global $testglobal;
echo 'hi' . $testglobal;
}
usort($topics, "cmp");
// hi WORKING hi WORKING