2014-02-06 3 views
1

Можно ли создать шаблон класса в PHP как в C++? PHP, вероятно, не имеет аналогичной языковой структуры (например, template ключевые слова в C++), но, может быть, есть какой-то умный трюк для достижения аналогичной функциональности?Шаблон класса в PHP, как в 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; 
+0

'public function Point()' должна быть 'public function __construct()' – Brice

ответ

2

Лучшее, что вы можете сделать, это функции 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

Я бы просто перешел в '$ argX' и' $ argY' без типа - PHP динамически набирается, поэтому нечего использовать для копирования C++ в этом отношении. Если вы хотите, вы можете проверить конструктор, что типы двух аргументов одинаковы (т. Е. Если они являются объектами, то проверяют соответствие их классов) и генерируют исключение, если они не являются. – CompuChip

+1

@CompuChip: Он хочет, чтобы члены '$ x' и' $ y' были экземплярами какого-либо типа, используя '$ argX' и' $ argY' соответственно в качестве аргумента конструктора. Я не понимаю, как вы можете это сделать, не зная, что такое тип. Если он просто не использует код, который он уже начал с ... –

+0

Он написал '$ objA = new Point (новый SomeClass (1), новый SomeClass (2));' в качестве примера, поэтому передавая объекты, созданные в результате. Все, что вам нужно сделать, это проверить, что они одного типа. – CompuChip

Смежные вопросы