2011-08-29 6 views
0

다음과 같은 문제가 있습니다. 내 응용 프로그램에는 두 가지 모델이 있지만 데이터베이스의 동일한 테이블에 저장됩니다. 그들은 type 열로 구분할 수 있습니다. 첫 번째 열은 0이고 두 번째 열은 1입니다.정적 메서드 상속

내 응용 프로그램에서는 각 유형별로 2 개의 클래스를 만들었습니다. 그러나 나는 한 번만 쿼리를 만들고 정적 멤버를 사용하여 유형을 파악하려고합니다. Basicly 내가 같을 것이다 달성하고 싶은 :

class A 
{ 
    public $Description; //From the database 

    public static function GetAll() 
    { 
     $query = "SELECT * FROM letters WHERE type = " . self::getType(); 

     echo $query; 
    } 

    private static function getType() 
    { 
     return 0; 
    } 
} 

class B 
    extends A 
{ 
    public $SomeOtherProperty; //B also has another property, which A doesnt have. Its stored an another table. 

    private static function getType() 
    { 
     return 1; 
    } 
} 

A::GetAll(10); 
B::GetAll(10); 

을하지만, PHP는이 출력 결과 정적 memberwriting 지원 나던 :

SELECT *을 편지에서 어디 유형 = 0

SELECT * FROM 문자 유형 = 0

하위 클래스가 자체 유형을 지정할 수있는 이러한 결과를 얻는 가장 좋은 방법은 무엇입니까?

+0

실제 답변이 아니지만 이와 같은 정적 클래스는 사용하지 않는 것이 좋습니다. PHP의 정적 호출은 기본적으로 상속 기능 및 기타 관련 기술을 사용하지 않고 관련 함수를 그룹화하는 방법입니다. – Quamis

+0

클래스 자체에는 정적 클래스가 없습니다. A는 모델의 모든 속성을가집니다. 그러나 데이터베이스에서 모든 A를 가져 오는 방법은 정적입니다. – TJHeuvel

답변

4

처음에 설명 된대로 메서드 GetType()를 상속 할 때, 당신은 보호 가시성을 사용해야 작동 정적 키워드 5.3의 새로운 기능 : http://php.net/manual/en/language.oop5.late-static-bindings.php

$query = "SELECT * FROM letters WHERE type = " . static::getType(); 

정적이 후기 바인딩을 보장는 나 때문에 사용됩니다 실제 유형의 thod가 사용됩니다. 당신은, 당신은 GETALL() 메서드에 다른 매개 변수를 전달할 수없는 경우 유형을 제공하기 위해

public static function GetAll() 
{ 
    $query = "SELECT * FROM letters WHERE type = " . static::getType(); 

    echo $query; 
} 

: 당신이 PHP를 사용하는 경우

+0

아, 그래서 이것은 새로운 후기 정적 바인딩 기능입니다. 고마워, 매력처럼 작동! – TJHeuvel

0

$type을 나타내는 클래스에서 정적 변수를 사용해보십시오. 내가 아는 한 정적 변수를 덮어 쓸 수 있습니다.

이것은 ph> 5.3에 맞아야합니다.

protected static function getType(); 

그리고 대한

현재 유형을 받고 PHP를 사용 : PHP 5.2에서는 당신이 댓글 모두의

+0

나는 이것을 시험해 보았지만 작동하지 않았다. 클래스 (A)의 현재 인스턴스 값은 기본 클래스에서 메서드를 호출 할 때 사용됩니다. – TJHeuvel

4

는> = 5.3 당신은 정적 키워드를 사용할 수 있습니다

public static function GetAll($type) 
{ 
    $query = "SELECT * FROM letters WHERE type = " . $type; 

    echo $query; 
}