2

クラスがあるとしましょう

class person {
    public static function get_pk(){
        return self::$primary_key;
    }
}

そして拡張クラス

class user extends person {
    protected $primary_key = 'id';
}

そして私は実行したい:

echo user::get_pk(); // should echo id

$primary_key は静的変数ではないため、これを実行するたびに自然に失敗します。主キーを返すにはどうすればよいですか?

はい、クラス構造、関数構造を変更して非静的にすることができますが、すべての意図と目的のために、変更できるのは静的関数 get_pk の内容だけであると想定します

4

3 に答える 3

1

staticプロパティを作成するには、クラスをインスタンス化する必要があるため、メソッドから非静的プロパティにアクセスすることはできません。ただし、クラスをイントロスペクトしてその定義の値を取得できます。

public static function get_pk() {
    $class = new ReflectionClass(get_called_class());
    $props = $class->getDefaultProperties();
    return $props['primary_key'];
}

しかし、実際には、これはかなり厄介であり、本番環境での使用にはお勧めしません。あなたのクラスを適切に構成して、どちらかであるかstaticどうかを判断してくださいstatic

于 2012-12-06T17:52:21.127 に答える
1

これが行われたことを確認できる唯一の方法は、親クラスで $primary_key 変数を宣言し、子クラス定義のスコープ外でそれに値を割り当てることです。(注意してください。クラスが静的であることを示す演算子を追加abstractし、規則に従ってクラス名の最初の文字を大文字にしました。)

<?

abstract class Person {
    public static $primary_key;
    public static function get_pk() {
        return self::$primary_key;
    }
}

abstract class User extends Person {
}

User::$primary_key = 'id';
echo User::get_pk();

/* End of file */

アップデート

Aram、$primary_key を非静的のままにしたい場合は、静的キーワード マニュアルに従って、「疑似変数 $this は、静的として宣言されたメソッド内では使用できません」と同様に、メソッドを非静的にする必要があります。

または、インスタンス化されたクラス オブジェクトを使用するようにコードを変換することもできます。

<?

class Person {
    public function get_pk() {
        return $this->primary_key;
    }
}

class User extends Person {
    protected $primary_key = 'id';
}

$user = new User();
echo $user->get_pk();

/* End of file */
于 2012-12-06T18:15:31.107 に答える
0

静的変数/メソッドはクラスに関連しています。つまり、オブジェクトを作成する必要はありません。オブジェクトprimary_keyごとに変数が作成されます。したがって、静的メソッドには特定のオブジェクトの概念がなく、primary_key. $this静的メソッドには変数(したがってself) が定義されていません。

あなたの最善の策は、静的キーワードを確認することだと思います。

于 2012-12-06T17:52:07.233 に答える