2011-05-09 5 views
4

제 애플리케이션에서 다르게 렌더링되는 요소가 여러 개 있습니다. 확장 된 추상 클래스를 만들었습니다.다른 수의 매개 변수를 사용하는 하위 클래스 생성자

abstract class Element { 

    protected $_value = null; 

    public function __construct($value) { 
     $this->_value = $value; 
    } 

    // ... 

    public abstract function render(); 

} 

요소의 예는 단락 태그로 묶은 텍스트 일 ​​수 있습니다.

class TextElement extends Element { 

    public function render() { 
     return "<p>{$this->_value}</p>\n"; 
    } 

} 

둘 이상의 값이있는 요소를 만드는 데 문제가 있습니다. 예를 들어 이미지 요소는 이미지 태그를 렌더링하고 여러 특성을 포함 할 수 있습니다. 추상 클래스의 생성자는 하나의 매개 변수 만 허용하기 때문에 이것은 문제입니다. 이 문제에 대한 두 가지 가능한 해결책이 있습니다. Element 생성자 (솔루션 1)에 다른 속성을 포함하는 배열을 전달할 수도 있고, 하위 클래스 (솔루션 2)의 생성자를 재정의 할 수도 있습니다. 제 질문은 이러한 솔루션 중 어느 것이 더 나은 디자인인지 또는 더 나은 솔루션이 존재하는지 여부입니다. 대신 인터페이스를 사용해야합니까? 사람이 어디에 코드를 볼 경우

해결 방법 1

class ImageElement extends Element { 

    public function render() { 
     return "<img src=\"{$this->_value['src']}\" alt=\"{$this->_value['alt']}\" />"; 
    } 

} 

$imageElement = new ImageElement(array('src' => '/image.png', 'alt' => 'image')); 

최초의 솔루션으로 해결 방법 2

class ImageElement extends Element { 

    protected $_alt; 

    public function __construct($src, $alt) { 
     $this->_value = $src; 
     $this->_alt = $alt; 
    } 

    // ... 

    public function render() { 
     return "<img src=\"{$this->_value}\" alt=\"{$this->_alt}\" />"; 
    } 

} 

답변

1

, 그들은 인수를 사용할 수 있는지 확인하려면 렌더링 기능을 검사해야 .

IDE가 자동 완성을 지원하거나 소스에서 문서를 생성 한 경우 인수 목록이 제공되므로 하루 빨리 처리 할 수 ​​있습니다.

$ 값은 실제로 사용되는 것에 대해별로 알려주지 않고 매개 변수가없는 요소를 실행하면 어떻게됩니까? 즉 BR 요소 또는 무엇인가.

솔루션 2가 더 정확하지만 '렌더링'기능 만 가진 인터페이스가 최상의 솔루션이라고 생각합니다.

+0

인터페이스를 사용하는 경우 요소 컬렉션을 반복 할 수 없게됩니다. 인터페이스와 추상 클래스를 사용하는 것이 좋을까요? 내가 보는 유일한 문제는 추상 클래스가 본질적으로 비어 있다는 것입니다. – birderic

1

두 가지 솔루션 모두 정상이지만, 귀하의 경우에는 첫 번째 해결책을 선택합니다. 여기서 HTML 요소를 다루므로 아마도 다수의 속성을 지원하게 될 것입니다. 그 중 다수는 선택 사항입니다. 이 괜찮아 보인다 : 당신이 생성자에 객체 또는 배열을 전달하는 것이 좋습니다, 선택 사항 중 많은 여러 인수를 전달해야 할 때마다이되지

class ImageElement extends Element { 
    public function __construct($src, $alt, $id = null, $class = null, $width = null, $height = null, $style = null, $title = null) {...} 
} 

$img = new ImageElement('/img/src.png', 'alt text', null, 'img-class', null, null, null, 'Image title'); 

너무 좋은

class ImageElement extends Element { 
    public function __construct($src, alt) {...} 
} 

$img = new ImageElement('/img/src.png', 'alt text'); 

. 훨씬 멋지게 보입니다.

$img = new ImageElement(array(
    'src' => '/img/src.png', 
    'alt' => 'alt text', 
    'class' => 'img-class', 
    'title' => 'Image title', 
)); 
0

오버로드 중! 불행히도 PHP는 오버로딩을하지 않으므로 다음과 같이 가장합니다.

public function __construct($VAL){ 
    if(is_array($VAL)){ 
     foreach($VAL as $k=>$v){ 
      $this->$k=$v; 
     } 
    }else{ 
     $this->_value=$VAL; 
    } 
} 
관련 문제