将单个构造用于多个参数

时间:2016-12-21 13:17:02

标签: php argument-unpacking

为了避免幻数和一些未来证明,我希望能够声明具有多个组成元素的单个常量或变量,以便在将来允许单个点更改值。 / p>

例如

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

2 个答案:

答案 0 :(得分:2)

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

请参阅https://3v4l.org/EGfFN

如果由于您使用的是古老版本的PHP而无法使用... operator,您还可以使用call_user_func_array

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19</version>
    <configuration> 
        <forkCount>5</forkCount>
        <reuseForks>true</reuseForks>
        <includes>
            <include>**/*IT.class</include>
        </includes>
    </configuration>
</plugin>

对于PHP版本&lt; 7你不能将常数设置为数组,而是必须使用变量。

答案 1 :(得分:0)

你的问题有2种方法。

首先,让我向你展示一篇引自罗伯特·C·马丁的书Clean Code(第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实现Color

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)

第二种方法,对面向对象不太好,但使用function argument syntax for PHP >= 5.6call_user_func_array传递可变数量的参数。

,我不能在你的例子中推荐(出于其他目的可能是一个很好的意识形态)