2013-10-04 105 views
1

如果我有一个抽象基类,像这样: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';。由于HouseUser之后声明,下次我拨打$user->getRows()时,在内部,User引用了父代Record,最终致电getRowsFromTable('houses')而不是getRowsFromTable('users')

我使用晚期静态绑定,以便从扩展类中获取属性;但由于UserHouse扩展了相同的父类,它们都以相同的属性值结束,尽管它们用不同的值覆盖它。

如果我是通过创建一个类Record2并具有House延长Record2复制的Record类,我不会有这个问题 - 但不会真正的帮助。

这是错误的设置?我应该在这种情况下不使用静态变量吗?如果是这样,我应该如何放置他们的位置?我知道$table不一定必须是静态的,但还有其他属性可能需要是静态的。

+0

'父::'?也许你应该试试 –

+1

我不知道我是否和你在一起'打破用户课堂' - 你能解释一下你的问题吗? –

+1

它可以使用'self ::'而不是'static ::'吗? –

回答

0

我真的不会为此使用静态字符串。

如何这样的事情...

abstract class Record { 
    /** 
    * @return table name as string 
    */ 
    abstract protected function getTable(); 

    public function getRows() { 
     return getRowsFromTable($this->getTable()); 
    } 
} 

然后,您具体的实现必须实现getTable,如

class User extends Record { 
    protected function getTable() { 
     return 'users'; 
    } 
}