не можете получить доступ к глобальным переменным внутри функции usort? - PullRequest
1 голос
/ 22 мая 2009

Я пытаюсь сделать usort в 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 определенно работает успешно (плюс, есть все эти "привет").

Я делаю что-то невероятно глупое здесь? Если нет, есть ли обходной путь?

Ответы [ 4 ]

2 голосов
/ 22 мая 2009

Код, который я добавил в свой вопрос, был помещен в шаблон на bbPress, двоюродном брате форума Wordpress. Один мой друг сказал мне, что «иногда PHP будет вести себя странно, если вы не глобализируете переменную до того, как ее определили, в зависимости от того, как вложен код, когда он выполняется - bbPress выполняет некоторые сложные операции ко времени вывода шаблона». *

Итак, я попробовал это, и это работает:

global $hi123;
$hi123 = ' working ';

Я отвечаю на свой вопрос, если другой идиот, как я, обнаружит это в поиске Google. : -)

Я собираюсь принять ответ VolkerK, потому что обходной путь к объекту довольно умный.

2 голосов
/ 22 мая 2009

Невозможно воспроизвести «ошибку», как и кодовая панель: 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 голос
/ 22 мая 2009

Работает ли это, если вы обращаетесь к переменной, используя суперглобальный массив $GLOBALS?

$testglobal = 1;
function cmp($a, $b) {
    echo 'hi' . $GLOBALS['testglobal'];
}
usort($topics, "cmp");
0 голосов
/ 22 мая 2009

Работает с 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...