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);
4

2 回答 2

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

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

f(...FOO);

https://3v4l.org/EGfFN

如果您因为使用的是旧版本的 PHP 而无法使用该...运算符,您也可以使用call_user_func_array

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

对于 PHP 版本 < 7,您不能将常量设置为数组,而必须使用变量。

于 2016-12-21T13:23:58.663 回答
0

您的问题有两种方法。

首先,让我向您展示Robert C Martin 的Clean Code book 的引述(第 3 章:函数。函数参数 - 参数对象,第 43 页):

当一个函数似乎需要两个或三个以上的参数时,很可能其中一些参数应该被包装到它们自己的类中。

如我所见,您的值代表 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 方法只需要接受一个实现 Color 的类:

public function setFillColor(Color $color)

第二种方法,它不适合面向对象,但使用PHP >= 5.6call_user_func_array的函数参数语法来传递可变数量的参数。我不能在您的示例中推荐(出于其他目的可能是一个好主意),但它存在。

于 2016-12-21T13:41:12.010 回答