php - 类似于 C++ 的 PHP 类模板

标签 php c++ class-template

是否可以像在 C++ 中一样在 PHP 中创建类模板? PHP 可能没有类似的语言结构(如 C++ 中的 template 关键字),但也许有一些巧妙的技巧可以实现类似的功能?

我有一个 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 的 eval 类功能,借此可以像这样实例化对象:

$className = 'SomeClass';
$obj = new $className;

这个,结合 airy-fairy 动态类型应该足以允许:

$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 构造函数中执行健全性检查,确保两个参数共享同一类型。

关于php - 类似于 C++ 的 PHP 类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21605535/

相关文章:

c++ - 双向链表节点插入位置

c++ - 来自缓冲区帮助 (BE) 的 Int16

c++ - 从类对象访问模板参数

php - 如何在一页上显示来自 PHP 查询的特定行数,然后在返回的行数超过指定数量时扩展 div

PHP RegEx 去除空段落标签

php - 插入 base64 图像作为 wordpress 帖子附件

c++ - 聚合初始化 - vector 和数组

c++ - 从函数指针作为模板参数的类型推导

c++ - C++中类模板内的模板类

php - 为什么建议 sanitizer 和逃逸分开进行