2013-05-25 3 views
-2

어떤 프로세스 중에 객체를받습니다.이 객체는 해당 색 구성표를 알아야합니다. 예를 들어, 나는 다음과 같이 저장되어있는 색상 표시 체계가 : 나는 사전에 모든 색 구성표의 이름을 알고PHP에서 프로그래밍 방식으로 클래스 참조하기

class FirstScheme { 
    public static $COLORS = array('1' => 'green', '2' => 'red', ...); 
} 
class SecondScheme { 
    public static $COLORS = array('1' => 'red', '2' => 'green', ...); 
} 

을; 코드가 변경 될 때만 변경할 수 있습니다. 그러나 각 개체에 사용되는 색 구성표는이 개체의 특성을 일치시켜 런타임에 결정해야합니다.

여기 어떻게해야할지 모르겠다. 모든 클래스가 있어야하기 때문에,

d = {'attr_value1': FirstScheme, 'attr_value2': SecondScheme, 'attr_value3': FirstScheme, ...} 

을 그리고 단지 "COLORS"변수에 액세스 : 파이썬에서 나는 딕셔너리는 다음과 같이 이름에 색 구성표의 매핑을 잡고 정의하는 것입니다. 하지만 PHP에는 그런 방식으로 클래스를 참조 할 방법이 없으므로 올바른 방법은 무엇입니까? 두 개 이상의 특성을 동일한 색 구성표에 매핑 할 수 있습니다.

+2

클래스가 아닌 객체를 전달하면 어떻습니까? 정적 메서드/속성은 일반적으로 나쁜 습관으로 간주됩니다. 객체의 경우 - 하나의 클래스 'ColorScheme'을 가지며 다른 스키마로 그것을 인스턴스화합니다. – zerkms

+0

왜? 색칠 체계가 사전 결정될 때 왜 개체가 필요한지 이해할 수 없습니다. 인스턴스화 할 필요가 없습니다. 사전에 알고 있습니다. – dragoon

+0

그들이 미리 결정된다는 사실은 통계학적인 해답이 짜증 난다는 사실을 어떻게 바꾸나요? 요청에 따라 다양한 색상 구성표를 생성하는 빌더를 생성하고 하드 코딩 된 클래스 및 속성 이름이 아닌 인터페이스별로 클래스를 묶습니다. – zerkms

답변

2

은 그들에게 얻을 수있는 인터페이스를 정의

$a = array(
    'attr_value1' => new FirstScheme(), 
    'attr_value2' => new SecondScheme(), 
); 

당신이 호출 할 수

$param = 'attr_value1'; 

if(!isset($a[$param])) 
    throw new Exception("undefined param"); 

if(!($a[$param] instanceof ColorsProvider)) 
    throw new Exception("Param should point to ColorsProvider"); 

$a[$param]->getColors(); 

완전한 객관적입니다. PHP에서이 효과를 얻는 간단한 방법이 있지만 내 솔루션은 우아합니다.


상기 다른 지점은 완전히 색의 소스 분리 인터페이스 이다.

abstract class DefaultColorsProviderImpl implements ColorsProvider    { 
    protected static COLORS = array(); 

    public function getColors() { 
     return self::COLORS; 
    } 
} 

class FirstScheme extends DefaultColorsProviderImpl { 
    protected static COLORS = array(...); 
} 

하지만 여전히 e.x.에서 색상을 반환 일반적인 구현을 만들 수 있습니다 : 등 하드 코딩 된 파일, 데이터베이스, XML에서있을 것


기본 구현 될 수 파일에서.

+0

'getColors()'구현은 부모 추상 클래스로 이동할 수 있습니다. 그리고 color 속성은 public이거나 static 일 필요는 없습니다. – zerkms

+0

일 수도 있지만,이 솔루션 (인터페이스 사용)을 사용하면 하드 코딩 된 배열 (위에서 언급했듯이)에서만 색상을 얻을 수 있습니다. 또 다른 방법은 array에서 색상을 반환하는 기본 구현 ('ColorsProviderArrayImpl')을 만드는 것입니다 (그리고 이것은 여러분이 언급 한 일반적인 해결책이지만 완전히 다른 구현을 만들 수있는 인터페이스를 기반으로합니다). – Athlan

+0

나는 여전히 코드 중복 (그들은 여전히 ​​같은 인터페이스를 구현한다)이나 public과 static ($ COLORS' 속성을 남겨두기위한 이유)을 보지 못했다. (직접적이 아닌 메서드를 사용하여 검색하기로 결정했다면) – zerkms

1

하는 대신 하드 코딩 다음과 같은 방법이 될 것입니다 자신의 클래스의 색상을 :

class ColorScheme { 

    protected $colors; 

    public function __construct(array $colors) { 
     $this->colors = $colors; 
    } 

    public function getColors() { 
     return $this->colors; 
    } 

} 

$scheme1 = new ColorScheme(array('red', 'blue', 'green')); 
$scheme2 = new ColorScheme(array('yellow', 'pink', 'cyan')); 

PHP에서 파이썬 사전에 대한 상응하는 연관 배열이다. 그래서 당신이 할 수 있습니다 : 당신이 행해져 Yout PARAMS의 스택 한

interface ColorsProvider { 
    function getColors(); 
} 
class FirstScheme implements ColorsProvider { 
    public static COLORS = array('1' => 'green', '2' => 'red', ...); 

    public function getColors() { 
     return self::COLORS; 
    } 
} 
class SecondScheme implements ColorsProvider { 
    public static COLORS = array('1' => 'red', '2' => 'green', ...); 

    public function getColors() { 
     return self::COLORS; 
    } 
} 

을 그런 : 모든 클래스이 색상을해야 경우

$d = array (
    'values_1' => $scheme1->getColors(), 
    'values_2' => $scheme2->getColors() 
); 
+0

런타임에서 매핑을 얻는 방법을 이해하지 못합니다. – dragoon

+0

'$ mapping = $ scheme1-> getColors();'또는'mapping'이란 무엇을 의미합니까? – hek2mgl

+0

좋아, 나는 다르게 설명하려고 노력할 것이다. 나는 그들 중 몇 사람처럼 색칠 공부를하고있다. 그들은 미리 알려져 있습니다. 그리고 런타임에 그들은 속성을 가지고있는 들어오는 객체를 가지고 있습니다.이 객체는 내가 적용해야하는 스키마를 찾을 수있게 해줍니다. 그래서 저는 {attr_value1 : FirstScheme, ...}을 제 질문에 넣었습니다. – dragoon

1
당신이 할 수 물론

:

$schemes = [ 
    'attr_value1' => FirstScheme::$COLORS, 
    'attr_value2' => SecondScheme::$COLORS, 
    ... 
]; 

을 심지어 런타임 : 다음

$schemes = [ 
    'attr_value1' => 'FirstScheme', 
    'attr_value2' => 'SecondScheme', 
    ... 
]; 

그리고 :

$reflector = new ReflectionClass($schemes['attr_value1']); 
$schema = $reflector->getStaticPropertyValue('COLORS'); 

그러나 이것은 전혀 유지 보수가없는 것, 그리고 당신이 것 그러한 정보를 적절한 데이터 레이어에 저장하는 것을 좋아합니다. 클래스의 정적 필드로 하드 ​​코딩하지 않아도됩니다. 요구].