【问题标题】:php, static method overloadingphp,静态方法重载
【发布时间】:2012-03-21 09:33:17
【问题描述】:

我有一个带有方法的对象,有时我需要将其调用为静态的,有时则不需要。

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

但是,还有什么更优雅的吗?

【问题讨论】:

  • 拥有这种切换器方法是非常糟糕的做法。我建议将方法提交为静态或非静态。
  • 你可以试试 if(isset($this)){}

标签: php function static overloading


【解决方案1】:

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

在这种情况下,您甚至会变得更糟,因为您显然期望同一个函数有两种不同的行为。这足以有两个独立的功能。此外,没有“更优雅”的方式来做到这一点。您唯一可以更改的就是假设,每当使用参数调用函数时,它都是静态的。其他选择包括反射(很慢)或debug_backtrace()(很丑)。

我可以推荐您观看“清洁代码讲座”中的一些讲座。即使这不能说服你改变你的风格,它也会给你一个坚实的介绍,比如依赖注入和单元测试:

另外,你真的应该停止使用旧的mysql_* 函数作为访问 MySQL 的 API。它们已经 10 多年了,不再维护,社区已经开始deprecation 的进程。

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

【讨论】:

  • +1,你只会在长期维护这个代码库的过程中被这个双重用途的代码咬住。
【解决方案2】:

一种更优雅的方法可能是将 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();

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多