2012-03-21 116 views
1

我有一個對象的方法,有時我需要調用靜態,有時不需要。php,靜態方法重載

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

,但仍然是有什麼更優雅?

+1

有這樣的切換方法是非常糟糕的做法。我建議只提交方法是靜態的或不是。 – deceze 2012-03-21 09:45:09

+0

你可以嘗試if(isset($ this)){} – 2013-10-16 12:07:25

回答

3

你應該避免使用一般的靜態調用[article]

而在這種情況下,你甚至會使情況變得更糟,因爲你明確地期望來自同一功能的兩種不同行爲。這足以構成兩個獨立的功能。此外,沒有「更優雅」的方式來做到這一點。只有你可以改變的事情是假設,每當函數被一個參數調用時,它就是靜態的。其他的選擇會包括反射(很慢)或debug_backtrace()(這是很難看的)。

我可以推薦你去觀看「Clean Code Talks」的講座。即使這不會說服你改變你的風格,它會給你像依賴注入和單元測試的概念了堅實的介紹:

此外,你真的應該停止使用舊的mysql_*函數作爲訪問MySQL的API。他們超過10歲,不再維護,社區已開始deprecation的過程。

您應該仔細看看替代方案:PDOMySQLi。他們都提供使用準備好的語句的能力。

+0

+1,在這個代碼庫的長期維護期間,你只會被這個雙重使用代碼咬傷。 – davidethell 2012-03-21 10:29:45

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