0

私はこれに似たクラスを持っています:

class My_Class {
    private static $array = null;
    private static $another_array = null;

    private function __construct() {
        self:$another_array = array( 'data' );
    }

    // This gets executed from jQuery Ajax when user clicks a button
    public static function process_ajax() {
        self::generate_html();
    }

    private static function generate_html() {
        if ( ! self::$array ) {
            self::$array = array( 'some data' );
        }
    }

    // This gets executed when user is trying to save Ajax generated form
    public static function save_ajax_form() {
        print_r( self::$another_array ); // prints [0] => 'data'
        self::validate_data();
    }

    private static function validate_data() {
        // WHY DOES THIS EVALUATE TRUE? 
        if ( ! is_array( self::$array ) ) {

        }

    }
}

My_Class::$arrayAjax 呼び出しからプロパティにアクセスするにはどうすればよいですか?

4

2 に答える 2

3

staticリクエストごとに初期化される変数を宣言している場合でも、nullPHP はこのように「ステートレス」であり、静的変数はリクエスト間で保持されません。値を永続化したいので、 のようなものを使用するか、 の値を保持する必要$_SESSIONAPCありmemcachedます$array

ajax がsave_ajax_form()すぐに呼び出すと、 が呼び出されますvalidate_data()。への$array呼び出しが別のリクエストで発生したため、変数はまだ null に初期化されてgenerate_html()いるため、配列ではないかどうかを確認すると true が返されます。

参照: PHP の静的変数はリクエスト全体で保持されますか?

于 2013-11-06T23:56:26.410 に答える
0

明らかに、スコープ宣言を から に変更するか、private非公開publicにしたい場合は public アクセサーを追加できます。

public function getArray()
{
    self::process_ajax();

    return self::$array;
}
于 2013-11-06T23:21:11.997 に答える