1

次のような基本抽象クラスがある場合:

<?php
abstract class Record {
    static $table;

    public function getRows () {
        return getRowsFromTable(static::$table);
    }
}
?>

そして、このクラスを次のように拡張したいと思います。

<?php
class User extends Record {
    static $table = 'users';

    private $name;
?>

次に、私が電話した場合:

<?php
$user = new User;
$user->getRows();
?>

内部的には、 をgetRows()呼び出して返しますgetRowsFromTable('users')

しかし、拡張する別のクラスを作成する場合Record:

<?php
class House extends Record {
    static $table = 'houses';

    private $address;
?>

次に、そのstatic $table = 'houses';宣言が をオーバーライドしRecord::$table、その結果、Userクラスが壊れます。

何が起こっているかというと、宣言static $table = 'houses';が親クラスにバブルアップするので、 now Record::$table = 'houses';. Houseは の後に宣言されているのでUser、次に を呼び出すと$user->getRows()、内部的にUserRecordを参照し、最終的getRowsFromTable('houses')に の代わりに を呼び出しますgetRowsFromTable('users')

拡張クラスからプロパティを取得するために、遅延静的バインディングを使用しています。しかし、UserHouseは同じ親クラスを継承しているため、異なる値でオーバーライドしても、どちらも同じプロパティ値になります。

Recordクラスを作成しRecord2Houseextendを使用してクラスを複製した場合Record2、この問題は発生しませんが、実際には役に立ちません。

これは間違った設定ですか?このコンテキストでは静的変数を使用すべきではありませんか? もしそうなら、私は彼らの代わりに何を入れるべきですか?必ずしも静的である必要はないことはわかって$tableいますが、静的である必要がある他のプロパティがあります。

4

1 に答える 1