PHP中的类模板,例如C 中的类模板

Class template in PHP like in C++

本文关键字:例如 PHP      更新时间:2023-10-16

可以像 c 中的 php 中创建类模板? php 可能没有类似的语言结构(例如 c 中的template关键词),但是也许有一些聪明的技巧可以实现类似的功能?

我有一个我想转换为模板的Point类。因此,在I类中使用键入参数,因此,对于每个类,我想传递到点方法,我必须创建一个具有适当类型参数的重点类的新副本。

这是样本表格 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的 eval -like功能,可以这样对象进行实例化:

$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构造函数内部进行理智检查,如果您愿意,这两个参数共享相同的类型。

相关文章: