Можно ли создать шаблон шаблона в PHP, как в C ++ ? PHP, вероятно, не имеет аналогичной структуры языка (например, ключевые слова template
на C ++ ), но, может быть, есть какой-то умный трюк для достижения аналогичной функциональности?
У меня есть класс Point
который я бы хотел преобразовать в шаблон. Поэтому в классе я использую аргументы ввода для каждого класса, я хотел бы перейти к методу Point, мне нужно создать новую копию класса Point с соответствующими типами аргументов.
Это образец формы C ++ :
#include<iostream> template <typename T> class Point { public: T x, y; Point(T argX, T argY) { x = argX; y = argY; } }; int main() { Point<int> objA(1, 2); std::cout << objA.x << ":" << objA.y << std::endl; Point<unsigned> objB(3, 4); std::cout << objB.x << ":" << objB.y << std::endl; return 0; }
И то же самое в PHP, но он вообще не работает (конечно, последняя, но одна строка возвращает ошибку):
class SomeClass { public $value; public function __construct($value = 0) { $this->value = $value; } } class OtherClass { public $value; public function __construct($value = 0) { $this->value = $value; } } class Point { public $x; public $y; public function Point(SomeClass $argX, SomeClass $argY) { $this->x = $argX; $this->y = $argY; } } $objA = new Point(new SomeClass(1), new SomeClass(2)); echo $objA->x->value . ":" . $objA->y->value . PHP_EOL; $objB = new Point(new OtherClass(3), new OtherClass(4)); echo $objB->x->value . ":" . $objB->y->value . PHP_EOL;
Лучшее, что вы можете сделать, это функции, похожие на PHP, в которых объекты могут быть созданы таким образом:
$className = 'SomeClass'; $obj = new $className;
Это, в сочетании с динамичной машиной с воздушной феей, должно быть достаточно, чтобы:
$objA = new Point('SomeClass', 1, 2); echo $objA->x->value . ":" . $objA->y->value . PHP_EOL; $objB = new Point('OtherClass', 3, 4); echo $objB->x->value . ":" . $objB->y->value . PHP_EOL;
Необходимое определение может выглядеть так:
class Point { public $x; public $y; public function __construct($className, $argX, $argY) { $this->x = new $className($argX); $this->y = new $className($argY); } }
Я не уверен, что я бы продвигал этот стиль кода. Ваш оригинальный подход кажется более ясным и чистым. Вы можете выполнить проверку работоспособности внутри конструктора Point
чтобы оба аргумента использовали один и тот же тип, если хотите.