2012-03-21 4 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

+0

if (isset ($ this)) {} –

답변

3

정적 전화는 일반적으로 [article]을 피해야합니다.

그리고이 경우 동일한 기능에서 두 가지 다른 동작이 분명히 예상되기 때문에 더 악화되고 있습니다. 이것이 두 가지 기능을 수행 할 수있는 충분한 이유입니다. 게다가, 그것을하는 "더 우아한"방법이 없습니다. 변경할 수있는 것은 매개 변수로 함수를 호출 할 때마다 정적이라는 가정을하는 것입니다. 다른 대안은 반향 (느림) 또는 debug_backtrace() (평범하지 않은 것) 중 하나를 포함합니다.

"깨끗한 코드 회담"에서 강의를 거의 보지 못하게하는 것이 좋습니다.

:이 스타일을 변경할 수 설득하지 않는다하더라도, 의존성 주입 및 단위 테스트 같은 개념에 당신에게 고체 소개를 줄 것이다

또한 이전 mysql_* 함수를 MySQL 액세스를위한 API로 사용해야합니다. 그들은 더 이상 10 세이며 더 이상 유지 관리되지 않으며 커뮤니티는 deprecation 과정을 시작했습니다.

PDOMySQLi을 선택해야합니다. 둘 다 준비 문을 사용할 수있는 능력을 제공합니다.

+0

+1,이 코드베이스를 장기간 유지 관리하는 동안이 이중 사용 코드로만 물릴 수 있습니다. – davidethell

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