Используйте одну конструкцию для нескольких аргументов

В попытке избежать магических чисел и некоторой проверки будущего, я хотел бы иметь возможность объявить одну константу или переменную с несколькими составляющими элементами, чтобы позволить одной точке изменять значения в будущем.

Например

$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

Решение

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 < Если вы не можете установить константу в массив, вам придется использовать вместо нее переменную.

2

Другие решения

Есть 2 подхода к вашему вопросу.

Прежде всего, позвольте мне показать вам цитату из Чистый код Книга Роберта С. Мартина (Глава 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.6 или же call_user_func_array передать переменное количество параметров. Что я не могу рекомендовать в вашем примере (для других целей может быть хорошей идеей), но это существует.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector