php, перегрузка статического метода - PullRequest
1 голос
/ 21 марта 2012

У меня есть объект с методом, который иногда мне нужно вызывать как статический, иногда нет.

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 ]

3 голосов
/ 21 марта 2012

Вам следует избегать использования статических вызовов вообще [article] .

И в этом случае вы даже ухудшаете ситуацию, потому что вы явно ожидаете два разных поведения от одной и той же функции,Этого достаточно, чтобы иметь две отдельные функции.Кроме того, нет более «элегантного» способа сделать это.Единственное, что вы можете изменить, это предположить, что всякий раз, когда функция вызывается с параметром, она является статической.Другие альтернативы могут включать отражения (которые являются медленными) или debug_backtrace() (что довольно уродливо).

Я могу порекомендовать вам посмотреть несколько лекций из "Чистых переговоров по коду".Даже если это не убедит вас изменить свой стиль, оно даст вам полное представление о таких понятиях, как внедрение зависимостей и модульное тестирование:

Кроме того, вам действительно следует прекратить использовать старые функции mysql_* в качестве API для доступа к MySQL.Им больше 10 лет, они больше не обслуживаются, и сообщество начало процесс обесценивания .

Вам следует внимательно рассмотреть альтернативы: PDO и MySQLi .Они оба предоставляют возможность использовать подготовленные заявления.

1 голос
/ 19 июля 2012

Более элегантный способ - выделить 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();
...