2009-05-21 23 views
1

私はPHPでusortを実行しようとしていますが、私はusort関数内でグローバル変数にアクセスすることはできません。代わりには、usort関数内のグローバル変数にアクセスできません。

hi1hi1 

:usortを想定し

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

私の期待はこれが出力されますされ、二回実行されます:私は私が何を意味するかを示すために裸の骨にダウン私のコードを簡素化しました

、私の出力は次のようになります。

hihi 

私はマニュアル(http://us.php.net/usort)を読んで、私はどんなリットルが表示されませんグローバル変数へのアクセスに関する模倣。私がエコーする変数にusortを割り当てると、1が出力されるので、usortは確実に正常に実行されます(プラス、それらのすべての "hi"があります)。

私はここで何か信じられないほど愚かなことをしていますか?回避策がありますか?

答えて

2

は「エラー」を再現することはできませんし、どちらのことができます。http://codepad.org/5kwctnDP

また、それは、PHP 5.2のように動作しているグローバル変数

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

スーパーグローバル$GLOBALSアレイを使用して変数にアクセスすると機能しますか? codepad

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

いいえ、私はそれを試しましたが、それを提案していただきありがとうございます! :-) – bobbyh

0

するのではなく、オブジェクトのプロパティを使用することができます。 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

私が質問に入れたコードは、 bbPress、Wordpressのフォーラムのいとこです。ある友人は、「コードが実行されたときのネストされた方法に応じて、変数を定義する前に変数をグローバルにしないと、PHPが奇妙に動作することがあります.bbPressは、テンプレートが出力するまでに複雑なものを含みます。

だから私はそれを試してみましたが、それが動作します:

global $hi123; 
$hi123 = ' working '; 

私のような別の馬鹿がGoogle検索でこれを見つけた場合、私は自分の質問に答えますよ。 :-)

私はオブジェクトの回避策がかなり賢いので、VolkerKの答えを受け入れるつもりです。

+0

ありがとう、ボビー!これにより、関数内でグローバル変数にアクセスできないという問題が解決されました。関数内のグローバルキーワードを使用するか、または$ GLOBALSスーパーアレイを使用します。それはインクルードされたファイルのPHP設定スコープと関係があります。 –

関連する問題