3

PHPの達人よ。私はいくつかの奇妙なクラス スコープの問題に遭遇しています。これは、明らかに php の癖に関係しています。通常とは異なる状況で次のエラーが発生する可能性があることを誰か教えてもらえますか...

致命的なエラー: 5 行目の MyClass.php でアクティブなクラス スコープがない場合、self:: にアクセスできません

さて、明らかに、クラスの外で self:: を使用すると、エラーが発生します...しかし、そうではありません。これが状況の単純化されたバージョンです...

//file1
class MyClass{
   public static function search($args=array()){
       $results = MyDbObject::getQueryResults("some query");
       $ordered_results = self::stack($results); //Error occurs here

       return $ordered_results;
   }
   public static function stack($args){
       //Sort the results
       return $ordered_results;
   }
}

//file 2
include_once("MyClass.php");
$args = array('search_term'=>"Jimmy Hoffa");
$results = MyClass::search($args);

このセットアップを考えると、どうすれば上記のエラーを取得できますか? これが私がこれまでに見つけたものです...

MyClass::search($args) //does not give the error (usually)
call_user_func("MyClass::search"); // this gives the error!

他の状況はありますか?

4

4 に答える 4

1

私の理解が正しければ、あなたはLate Static Bindingを探しています。この機能には、少なくとも PHP バージョン 5.3 が必要です。

于 2010-10-22T17:10:13.397 に答える
1

パラメータを渡していませんが、メソッドはそれらを探しています。試す

call_user_func("MyClass::search", $args);

これはphp 5.3.1では機能しますが、call_user_func("MyClass::search");機能しません

于 2010-10-22T17:57:15.417 に答える
0

コードは問題ないようです。何か問題があるのなら、私はその問題を見逃しているに違いありません。自分への呼び出し::は完全にクラスの範囲内にあるようです!そして、静的スコープ、具体的には、self::の目的です。

PHPオブジェクトのパターンと実践の第3版(素晴らしい本)から:

(子からではなく)同じクラス内から静的メソッドまたはプロパティにアクセスするには、selfキーワードを使用します。自己は、$this疑似変数がオブジェクトに対して何であるかをクラス化することです。したがって、StaticExampleクラスの外部から、クラス名を使用して$aNumプロパティにアクセスします。

StaticExample::$aNum;

StaticExampleクラス内から、selfキーワードを使用できます。

class StaticExample {`
    static public $aNum = 0;

    static public function sayHello() {
        self::$aNum++;
        print "hello (".self::$aNum.")\n";
    }
}

したがって、このコードが失敗した理由はわかりません。おそらくPHPのバグですか?実際にself::をクラスのスコープ外で使用しようとしたときに、このエラーが発生しました。エラーは次のようになりました。

public static function get_names() {
    $machine_names = self::get_machine_names();

    return array_map(function ($machine_name) {
        $service_settings = self::get_settings_by_machine_name($machine_name);
        return $service_settings . $machine_name;
        },
        $machine_names
    );
}

したがって、クロージャの範囲内でself ::を使用しているため、エラーが発生します。エラーを修正するために、クロージャの前にself :: get_settings_by_machine_name()を呼び出し、その結果をクロージャのスコープに渡すことができますuse

コードで何が起こっているのかわからない。

于 2012-06-10T15:58:32.867 に答える
0

これを試して:

call_user_func(array('MyClass', 'search'));

http://php.net/call_user_funcの例 #4 も参照してください。

于 2010-10-22T18:03:29.650 に答える