【发布时间】:2014-05-23 08:25:20
【问题描述】:
标题有点误导,因为我知道不可能在子级上共享静态 var,但我正在寻找一种方法来解决我的问题,而无需使用共享静态 var。
我有一个名为“Model”的超类和一些名为“User”和“Company”的底层子类。我想尽可能地自动化,以便子类只有字段,仅此而已。
我想在超类中创建 static 'GetAll' 和 'GetByKey' 方法,以便可以使用以下代码:
$users = User::getAll();
$company = Company::getByKey(34); // Where 34 is the ID.
就我而言,Company 类应该知道他的主键,而无需我每次都告诉他。我不想在子类中避免这样的方法:
public static function getByUserId($userId)
{
return static::find(array('userId' => $userId));
}
为此,我在超类中创建了一个静态变量“primaryKey”。问题是,没有完美的地方来“设置”变量。如果我唯一要做的就是获取所有用户,则不会使用构造函数。接下来,静态变量属于模型,这意味着它将被覆盖,如果我有这样的代码:
$company = new Company(); // Model sets 'primaryKey' to 'id'
$user = User::GetByKey('myUsername'); // The 'primaryKey' is still 'id', but it should be 'username'
我确实想要保存 $primaryKey,因为每次我请求某些模型时从 MySQL 获取主键只是开销。
有没有办法给子类自己的静态变量值而不在特定类中创建它们?我想尽量减少为模型所做的工作量。使用反射或魔术方法完全没有问题。在最荒谬的情况下,我必须创建一个 DatabaseManager,它有一个包含所有模型的所有信息的数组。
注意:我问的是是否有解决我的问题的方法,即使不推荐或丑陋的代码也是如此。我知道这个问题已经被问过很多次了。
提前致谢,
【问题讨论】:
-
如果我正确理解了您的问题,如果您在没有静态的情况下设计应用程序逻辑,您就不会遇到这个问题。
-
如何在每个类中设置主键为常量,然后通过常量([称为类].'primary_key')获取值。很抱歉无法提供一些代码,但我正在浏览 SO,同时接听一些支持电话@work。
-
你为什么不简单地实例化你的类?!请看How Not To Kill Your Testability Using Statics
-
illuzive:我有更多这样的变量,这样可以解决问题。 @deceze,Ben-beri:您的意思是: $modelManager->GetByKey('User', 'myUsername'); ?
-
@ErwinOkken 看看我的回答。
标签: php inheritance static