php,静态方法重载

标签 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);

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

最佳答案

一般情况下您应该避免使用静态调用 [article] .

在这种情况下,你甚至会让情况变得更糟,因为你显然期望同一函数有两种不同的行为。这就是拥有两个独立功能的充分理由。此外,没有“更优雅”的方式来做到这一点。唯一可以改变的就是假设,每当使用参数调用函数时,它都是静态的。其他替代方案包括反射(速度很慢)或 debug_backtrace()(非常难看)。

我可以推荐您观看“Clean Code Talks”中的一些讲座。即使这不能说服您改变您的风格,它也会为您提供依赖注入(inject)和单元测试等概念的可靠介绍:

此外,您确实应该停止使用旧的 mysql_* 函数作为访问 MySQL 的 API。它们已有 10 多年历史,不再维护,社区已开始 deprecation 的过程。

您应该仔细研究替代方案:PDOMySQLi 。它们都提供使用准备好的语句的能力。

关于php,静态方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9801816/

相关文章:

javascript - 如何检测并阻止用户使用 php/javascript 从多个浏览器选项卡访问 Web 应用程序?

function - append 到函数 lua

javascript - 我正在尝试使用 onclick 事件在循环内定义一个函数,但它并没有像我预期的那样工作。我应该怎么做?

c++ - 静态局部变量什么时候出现?

php - WordPress 网站在 url 中添加 https 时损坏

php - 正则表达式从 HTML 中删除 id 属性

php - 使用 php 将表单数据传递到另一个页面

c++ - if 语句中的函数名以一种奇怪的方式转换

java - 我们可以在 Java 中调用带有空对象的静态方法吗?如果是这样,如何?

java - NullPointerException 或将打印静态变量的内容