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