无法在usort函数中访问全局变量?

时间:2009-05-21 20:34:41

标签: php

我正在尝试用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”)。

我在做一些令人难以置信的愚蠢事吗?如果没有,是否有解决方法?

4 个答案:

答案 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