我正在研究一个简单的ORM解决方案,并遇到棘手的情况。理想情况下,我希望能够在静态上下文和对象上下文中使用方法,具体取决于它如何被调用。我不知道这是可能的,但这里是我的意思是:静态/非静态方法问题
假设一个用户模式要调用其中()静态,这目前工作正常,例如:
$user = User::where('id = ?', 3);
现在,我也支持关系,例如用户可以拥有消息。当建立这种关系时,我只需在用户模型中存储消息模型的空白副本并设置一个外键。例如:
$user -> messages = new Message();
$user -> messages -> foreign_key = 'user_id';
现在,理想情况下,我想能够调用:
$user -> messages -> where('unread = ?', 1);
在非静态上下文,并利用$如此 - > foreign_key时在这方面如此至于只拉外键与用户的id相匹配的消息。这种类型的上下文切换可能在PHP中?任何从静态上下文引用$ this都会抛出一个错误作为其静态方法,并且不应该依赖$ this(由于显而易见的原因,当从静态上下文中调用时,$ this将不存在)
是否有任何聪明的方法呢?我尝试了重载方法来获得两个不同的原型,它们都带有和不带static关键字,但是这会引发重新声明错误。
$ user = User :: find();如果它没有指定外键,你希望这个返回什么? – craig1231
看起来在顶层用法中,'find()'是'User'类中的一个(静态)函数,但在底层使用中,find()是Message类中的一个方法。哪一个?都? – jedwards
也许这是一个不清楚的例子,我忽略了这些参数,因为它们看起来与问题无关,但我会用更准确的表示法来清除它,以确定它是如何工作的。 –