【问题标题】:Overload PHP methods重载 PHP 方法
【发布时间】: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


【解决方案1】:

静态方法可以以对象的方式调用,所以有静态方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多