如果我有一個抽象基類,像這樣:PHP - 擴展靜態屬性/子類
<?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';
氣泡達到父級,所以現在Record::$table = 'houses';
。由於House
在User
之後聲明,下次我撥打$user->getRows()
時,在內部,User
引用了父代Record
,最終致電getRowsFromTable('houses')
而不是getRowsFromTable('users')
。
我使用晚期靜態綁定,以便從擴展類中獲取屬性;但由於User
和House
擴展了相同的父類,它們都以相同的屬性值結束,儘管它們用不同的值覆蓋它。
如果我是通過創建一個類Record2
並具有House
延長Record2
複製的Record
類,我不會有這個問題 - 但不會真正的幫助。
這是錯誤的設置?我應該在這種情況下不使用靜態變量嗎?如果是這樣,我應該如何放置他們的位置?我知道$table
不一定必須是靜態的,但還有其他屬性可能需要是靜態的。
'父::'?也許你應該試試 –
我不知道我是否和你在一起'打破用戶課堂' - 你能解釋一下你的問題嗎? –
它可以使用'self ::'而不是'static ::'嗎? –