次のような基本抽象クラスがある場合:
<?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()
、内部的にUser
親Record
を参照し、最終的getRowsFromTable('houses')
に の代わりに を呼び出しますgetRowsFromTable('users')
。
拡張クラスからプロパティを取得するために、遅延静的バインディングを使用しています。しかし、User
とHouse
は同じ親クラスを継承しているため、異なる値でオーバーライドしても、どちらも同じプロパティ値になります。
Record
クラスを作成しRecord2
てHouse
extendを使用してクラスを複製した場合Record2
、この問題は発生しませんが、実際には役に立ちません。
これは間違った設定ですか?このコンテキストでは静的変数を使用すべきではありませんか? もしそうなら、私は彼らの代わりに何を入れるべきですか?必ずしも静的である必要はないことはわかって$table
いますが、静的である必要がある他のプロパティがあります。