2009-05-21 10 views
1

J'essaie de faire un usort en PHP, mais je ne peux pas accéder aux variables globales à l'intérieur d'une fonction usort.ne peut pas accéder à des variables globales dans une fonction usort?

J'ai simplifié mon code jusqu'à os nus pour montrer ce que je veux dire:

$testglobal = 1; 
function cmp($a, $b) { 
    global $testglobal; 
    echo 'hi' . $testglobal; 
} 
usort($topics, "cmp"); 

En supposant que le usort s'exécute deux fois, mes attentes est ce sera la sortie:

hi1hi1 

lieu , ma sortie est:

hihi 

J'ai lu le manuel (http://us.php.net/usort) et je ne vois pas l imitations sur l'accès aux variables globales. Si j'affecte l'usort à une variable que j'écoute, il en sort 1, donc l'usort fonctionne bien (en plus, il y a tous ces "hi"). Je fais quelque chose d'incroyablement stupide ici? Si non, y a-t-il une solution de contournement?

Répondre

2

Impossible de reproduire le "erreur" et ne peut pas non CodePad: http://codepad.org/5kwctnDP

Vous pouvez également utiliser les propriétés de l'objet au lieu des variables globales

<?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

Est-ce que cela fonctionne si vous accédez à la variable en utilisant la matrice $GLOBALS super-globale?

$testglobal = 1; 
function cmp($a, $b) { 
    echo 'hi' . $GLOBALS['testglobal']; 
} 
usort($topics, "cmp"); 
+0

Non, j'ai essayé, mais merci de le suggérer! :-) – bobbyh

0

Il travaille depuis 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 
2

Le code que j'ai mis dans ma question a été déposé dans un modèle sur bbPress, qui est le cousin du forum à Wordpress. Un ami m'a dit que "Parfois, PHP agira bizarrement si vous ne définissez pas une variable avant de la définir, en fonction de l'imbrication du code lors de son exécution - bbPress fait des inclusions complexes au moment où le template sort".

J'essayé et ça fonctionne:

global $hi123; 
$hi123 = ' working '; 

Je réponds à ma propre question au cas où un autre idiot comme moi trouve cela dans une recherche Google. :-)

Je vais accepter la réponse de VolkerK, cependant, parce que la solution de contournement d'objet est assez intelligente.

+0

Merci, Bobbyh! Cela a résolu mon problème de ne pas pouvoir accéder aux variables globales à partir d'une fonction, soit en utilisant le mot clé global dans la fonction, soit en utilisant le superarray $ GLOBALS. Cela doit avoir quelque chose à voir avec la mise en place de PHP sur les fichiers include'd. –

Questions connexes