2016-12-21 2 views
2

마법 숫자 및 향후 검증을 피하기 위해 단일 구성 요소가있는 단일 상수 또는 변수를 선언하여 단일 지점을 변경할 수있게하고 싶습니다. 미래의 가치. 다중 인수에 단일 구문 사용

$myPdf->setFillColor(88, 38, 123) # using this method many times in a routine. 

예를

를 들어

이제 이해 관계자 (... 오랜 요구 사항에 서명 오프 후) PDF의 배경색을 변경하려면 지금이 RGB 값을 변경할 수있는 많은 장소가있다. setFillColor($r, $g, $b) 메서드는 타사 구성 요소의 메서드이므로 단일 배열 인수를 받아들이도록 메서드를 변경할 수 없습니다.

setFillColor() 메서드에 대한 개별적인 필수 인수로 압축을 풀 수있는 단일 구문을 선언하는 방법이 있습니까? 다음과 같은 것이 가능합니까?

$my_color = [88, 38, 123]; 
$myPdf->setFillColor($my_color); 
+0

'call_user_func_array()'을보십시오 : http://php.net/manual/en/function.call-user-func-array.php – arkascha

+0

@arkascha 아마도 [call-user- func-array] (http://php.net/manual/en/function.call-user-func-array.php) –

+0

@AlexBlex 그 점을 지적 해 주셔서 감사합니다! – arkascha

답변

2
define('FOO', [1, 2, 3]); 

function f($a, $b, $c) { 
    var_dump($a, $b, $c); 
} 

f(...FOO); 

https://3v4l.org/EGfFN를 참조하십시오. 당신이 PHP의 고대 버전을 사용하고 있기 때문에 당신이 ... operator를 사용할 수없는 경우

, 당신은 또한 call_user_func_array 사용할 수 있습니다 : 당신은 배열 상수를 설정할 수 없습니다 < 7 PHP 버전에 대한

call_user_func_array([$myPdf, 'setFillColor'], MY_COLOR) 

, 대신 변수를 사용해야합니다.

0

귀하의 질문에 2 가지 방법이 있습니다. 모든

첫째, 내가 당신에게 로버트 C 마틴의 Clean Code 책에서 인용 보여주지 (제 3 장 : 함수를 함수의 인수 - 인수 개체, 43 페이지가.) :

함수가 더 필요한 것으로 보인다 때 2 개 또는 3 개의 주장보다, 그러한 주장 중 일부는 그들 자신의 클래스로 싸여 져야 할 가능성이있다.

귀하의 값은 RGB 색상을 나타냅니다. 그냥 수업으로 포장하지 않는 이유는 무엇입니까?

class RGB 
{ 
    private $blue; 
    private $green; 
    private $red; 

    public function __construct($red , $green , $blue) 
    { 
     $this->red = $red; 
     $this->green = $gree; 
     $this->blue = $blue; 
    } 

    /** others necesary methods **/ 
} 

그리고 단지 당신이 원하는대로 사용

$my_color = new RGB(88, 38, 123); 
$myPdf->setFillColor($my_color); 

을 그리고 당신은 색상 시스템의 다른 종류를 사용해야하는 경우, 단지 인터페이스를 사용

interface Color { } 

이 RGB가

색상 구현을
class RGB implements Color 

그리고 새로운 색상 시스템 :

class CMYK implements Color 
{ 
    private $cyan; 
    private $magenta; 
    private $yellow; 
    private $black; 

    public function __construct($cyan , $magenta , $yellow , black) 
    { 
     $this->cyan = $cyan; 
     $this->magenta = $magenta; 
     $this->yellow = $yellow; 
     $this->black = $black; 
    } 
} 

는 PDF 방법은 바로 컬러 구현하는 클래스 동의가 필요합니다

public function setFillColor(Color $color) 

두 번째 방법을, 그것은 객체 지향 잘 아니지만, 변수 번호를 전달하는 function argument syntax for PHP >= 5.6 또는 call_user_func_array을 사용하고 있습니다 매개 변수나는 당신의 모범에서 (다른 목적을 위해 좋은 이데아가 될 수 있음) 추천할만한 것이 없지만 그것은 존재합니다.

+0

@RyanVincent 가능하고 훨씬 더 많습니다. 그러나 나는 이것을하지 않을 것이다. 당신이 클래스의 목적을 제거하고 있기 때문에 (함수는 같은 것을 할 수있다). 한 무리의 변수를 하나의 클래스에 캡슐화하면 그 클래스에 대한 이유/목적이 나타납니다. 그 후, 클래스는 코드가 필요함에 따라 행동 할 수 있습니다 (솔리드 패러다임에 맞춰야 함). –

+0

@RyanVincent 아니요, 이해하기 쉽지 않거나 유연하지 않습니다. OOP의 경우이 경우 가장 유연한 인터페이스를 사용합니다. 유연성을 위해 데코레이터와 같은 다른 패턴을 사용할 수 있습니다. –

관련 문제