【发布时间】:2014-09-09 12:20:46
【问题描述】:
我知道在 PHP 中重载是不可用的,并且有一个使用 func_get_args 的解决方法。但我的问题是,如果我想制作同一方法的静态和非静态版本,我该怎么办?例如,我有一个 Profiles_Model 类。有时我可能只想获取所有配置文件但仅此而已,所以我不想实例化对象,调用静态方法就足够了:
Profiles_Model::getProfiles();
但有时我可能有一个来自类的实例化对象并且我使用其他方法,我希望不仅类而且对象本身具有相同的方法,例如:
$pmodel=new Profiles_Model();
$pmodel->getProfiles();
有什么解决办法吗?这就是我想要的:
class Profiles_Model extends Model{
.
.
.
public function getProfiles(){
// do some stuff
}
public static function getProfiles(){
// do some stuff with the same results
}
}
【问题讨论】:
-
如果结果真的一样,为什么要避免使用“self”或“static”调用静态方法?
-
我会避免使用包含不同行为的同名方法。可能会令人困惑,并且可能会破坏单一责任。我很确定 Profiles_Model 的实例有一个名为 getProfiles() 的方法会返回它包含的项目的列表。调用 Profiles_Model::getProfiles() 表明该类知道如何获取配置文件,因此行为不同。
-
如果它们产生相同的结果 - 为什么要复制它们?另外,我鼓励您使用对象(非静态)中的方法,因为它们的速度是我记得的两倍。
-
我相信你可以根据解析的参数数量巧妙地使用 func_get_args 和一些匿名函数
-
@kleskowy 正在谈论微秒级的裸机性能。如果您有一个需要 30 秒才能运行的查询。使用静态或方法将是性能的分数差异
标签: php overloading