重载PHP方法
我知道PHP中的重载是不可用的,func_get_参数有一个解决方法。但我的问题是,如果我想制作同一方法的静态和非静态版本,我该怎么办?例如,我有一个Profiles\u模型类。有时,我可能只想获取所有概要文件,但仅此而已,因此我不想实例化对象,调用静态方法就足够了,如: Profiles_Model::getProfiles() 但有时我可能会从类中得到一个实例化对象,并使用其他方法,我希望不仅类,而且对象本身都有相同的方法,如:重载PHP方法,php,overloading,Php,Overloading,我知道PHP中的重载是不可用的,func_get_参数有一个解决方法。但我的问题是,如果我想制作同一方法的静态和非静态版本,我该怎么办?例如,我有一个Profiles\u模型类。有时,我可能只想获取所有概要文件,但仅此而已,因此我不想实例化对象,调用静态方法就足够了,如: Profiles_Model::getProfiles() 但有时我可能会从类中得到一个实例化对象,并使用其他方法,我希望不仅类,而且对象本身都有相同的方法,如: $pmodel=new Profiles_Model(); $
$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
}
}
静态方法可以以对象的方式调用,因此使用静态方法
Profiles_Model::getProfiles();
也将提供
$pmodel=new Profiles_Model();
$pmodel->getProfiles();
但在方法中,您不能访问对象的属性,只能访问静态字段和静态方法
但你能耍的把戏是:
class a
{
public static function __callStatic($name, $arguments)
{
if ($name === 'b')
{
echo "a::b() called";
return true;
}
throw new BadMethodCallException();
}
public function __call($name, $arguments)
{
if ($name === 'b')
{
echo "b() called in object context";
return true;
}
throw new BadMethodCallException();
}
}
示例:
$a = new a();
$a->b(); // b() called in object context
a::b(); // a::b() called
如果结果真的是一样的,为什么不使用“self”或“static”调用静态方法?我会避免使用包含不同行为的同名方法。可能会令人困惑,可能会打破单一责任。我非常确定Profiles_模型的一个实例有一个名为getProfiles()的方法,它将返回它所包含的项的列表。调用Profiles_Model::getProfiles()表明类知道如何获取配置文件,因此行为不同。如果它们产生相同的结果,为什么要复制它们?另外,我鼓励您使用来自对象(非静态)的方法,因为它们的速度是我记忆中的两倍。我相信您可以根据参数的数量巧妙地使用func_get_args和一些匿名函数parsed@kleskowy我们谈论的是微秒级的裸机性能。如果您有一个运行时间为30秒的查询。使用静态或静态方法将导致性能上的分数差异