2016-12-21 52 views
2

マジックナンバーと将来の妥協を避けるため、単一の定数または変数を複数の構成要素で宣言して、単一の点を変更できるようにしたい将来の価値。例複数の引数に単一の構文を使用する

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

については

は今、利害関係者は、PDFの背景色を変更したい(要件はずっと後にサインオフ...)ので、このRGB値を変更するための多くの場所があります。メソッドsetFillColor($r, $g, $b)は第三者コンポーネントからのものですので、メソッドを変更して単一の配列引数を受け入れることはできません。

setFillColor()メソッドの3つの個別の必須引数に解凍する単一の構文を宣言する方法はありますか?次のようなものがありますか?

$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を使用することができます。

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

アレイに定数を設定することはできませんPHPのバージョン< 7の場合は、代わりに変数を使用する必要があります。

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 

そして新しいカラーシステムPDFの方法は、単に色実装するクラス受け入れる必要

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; 
    } 
} 

public function setFillColor(Color $color) 

第二のアプローチを、それがオブジェクト指向のためによくないですが、可変数を渡すfunction argument syntax for PHP >= 5.6call_user_func_arrayを使用していますパラメータの私はあなたの例ではお勧めできませんが(それ以外の目的のためには良いアイディアかもしれません)、それは存在します。

+0

@RyanVincentそれは可能ですし、はるかに。しかし、私はこれをしません。あなたがクラスの目的を取り除いているので(関数は同じことをすることができます)。クラスに変数の束をカプセル化すると、そのクラスに理由/目的が与えられます。その後、クラスはコードが必要とするように振る舞うことができます(SOLIDパラダイムに合わせる必要があります) –

+0

@RyanVincentそうではない、わかりにくい、柔軟性がない。 OOPの場合、この場合最も柔軟なのはインタフェースを使用することです。デコレータとしての他のパタ​​ーンは、柔軟性のために使用することができます –

関連する問題