php,静态方法重载

时间:2012-03-21 09:33:17

标签: php function static overloading

我有一个方法对象,有时我需要调用静态,有时不需要。

class MYOBJECT
{
  private $group_id;

  public function SetGroupId($_id) { $this->group_id = $_id; }

  public static function GetGroupName($_id=NULL)
  {
    // is there any way to implement condition like this?
    if( _called_as_static ) $id = $_id;
    else $id = $this->group_id;

    $query mysql_query("SELECT name FROM group WHERE id = $id");
    list($name) = mysql_fetch_array($query);

    return $name;
  }
}

$obj = new MYOBJECT;
$obj->SetGroupId(4);

// should work both ways
$name = $obj->GetGroupName();
$name = MYOBJECT::GetGroupName(4);

我这样解决了:

public static function MYOBJECT::GetGroupName($_id=NULL)
{
  if( is_object($_id) ) $_id = $_id->GetGroupId();

  ...
}

$name = MYOBJECT:GetGroupName(4);
$name = $obj->GetGroupName($obj);

但是,还有更优雅的东西吗?

2 个答案:

答案 0 :(得分:3)

您应该避免使用静态调用[article]

在这种情况下,你甚至会使情况变得更糟,因为你显然期望来自同一功能的两种不同行为。这是足以拥有两个独立功能的原因。此外,没有“更优雅”的方式来做到这一点。只有你可以改变的地方是假设,无论何时用参数调用函数,它都是静态的。其他替代方案可能包括反射(慢速)或debug_backtrace()(这很简单)。

我建议您观看“清洁代码会谈”中的一些讲座。即使这并不能说服您改变自己的风格,它也会为您提供依赖注入和单元测试等概念的可靠介绍:

另外,你真的应该停止使用旧的mysql_*函数作为访问MySQL的API。他们已经超过10岁,不再维持,社区已开始deprecation的过程。

您应该仔细查看备选方案:PDOMySQLi。它们都提供了使用准备好的陈述的能力。

答案 1 :(得分:1)

更优雅的方法可能是隔离group_id => group_name作为静态方法。而不只是重用所述方法

<?php
class MYOBJECT
{
  private $group_id;

  public function SetGroupId($_id) { $this->group_id = $_id; }

  public function GetGroupName() { 
    return self::GetGroupNameByID($this->group_id);
  }
  public function GetGroupId() { return $this->group_id; }

  public static function GetGroupNameByID($_id)
  {
    // Check if $_id is MYOBJECT
    $id = $_id instanceof self ? $_id->GetGroupID() : $_id;

    $query mysql_query("SELECT name FROM group WHERE id = $id");
    list($name) = mysql_fetch_array($query);

    return $name;
  }
}

$name = MYOBJECT::GetGroupNameByID(4);
$name = MYOBJECT::GetGroupNameByID($obj);
$name = $object->GetGroupName();