首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类模板在PHP中类似于C++

类模板在PHP中类似于C++
EN

Stack Overflow用户
提问于 2014-02-06 14:24:07
回答 1查看 3.2K关注 0票数 5

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

我有一个Point类,我想把它转换成一个模板。在类中,我使用类型参数,因此,对于每个类,我想传递给Point方法,我必须创建一个带有适当类型参数的Point类的新副本。

这是C++表格的样例

代码语言:javascript
复制
#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中也是如此,但是它根本不起作用(当然,最后一行返回一个错误):

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

发布于 2014-02-06 14:25:26

您能做的最好的就是PHP的eval-like特性,可以这样实例化对象:

代码语言:javascript
复制
$className = 'SomeClass';
$obj = new $className;

这一点,再加上空中仙女的动态输入,应该足以允许:

代码语言:javascript
复制
$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;

必要的定义可能如下:

代码语言:javascript
复制
class Point
{
    public $x;
    public $y;

    public function __construct($className, $argX, $argY)
    {
        $this->x = new $className($argX);
        $this->y = new $className($argY);
    }
}

不过,我不确定我是否会推广这种代码风格。你最初的方法似乎更清晰更清晰。如果您愿意,可以在两个参数共享相同类型的Point构造函数中执行正常检查。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21605535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档