Шаблон класса в PHP как в переполнении стека

Есть ли возможность создать шаблон класса в 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;

1

Решение

Лучшее, что вы можете сделать, это PHP eval-подобные функции, посредством которых объекты могут быть созданы следующим образом:

$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 конструктор, который оба аргумента имеют один и тот же тип, если хотите.

2

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

Других решений пока нет …

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