次のような基本抽象クラスがある場合:
<?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てHouseextendを使用してクラスを複製した場合Record2、この問題は発生しませんが、実際には役に立ちません。
これは間違った設定ですか?このコンテキストでは静的変数を使用すべきではありませんか? もしそうなら、私は彼らの代わりに何を入れるべきですか?必ずしも静的である必要はないことはわかって$tableいますが、静的である必要がある他のプロパティがあります。