Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重载PHP方法_Php_Overloading - Fatal编程技术网

重载PHP方法

重载PHP方法,php,overloading,Php,Overloading,我知道PHP中的重载是不可用的,func_get_参数有一个解决方法。但我的问题是,如果我想制作同一方法的静态和非静态版本,我该怎么办?例如,我有一个Profiles\u模型类。有时,我可能只想获取所有概要文件,但仅此而已,因此我不想实例化对象,调用静态方法就足够了,如: Profiles_Model::getProfiles() 但有时我可能会从类中得到一个实例化对象,并使用其他方法,我希望不仅类,而且对象本身都有相同的方法,如: $pmodel=new Profiles_Model(); $

我知道PHP中的重载是不可用的,func_get_参数有一个解决方法。但我的问题是,如果我想制作同一方法的静态和非静态版本,我该怎么办?例如,我有一个Profiles\u模型类。有时,我可能只想获取所有概要文件,但仅此而已,因此我不想实例化对象,调用静态方法就足够了,如:

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
    }

}

静态方法可以以对象的方式调用,因此使用静态方法

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秒的查询。使用静态或静态方法将导致性能上的分数差异