【问题标题】:Class template in PHP like in C++PHP 中的类模板,如 C++ 中的类模板
【发布时间】:2014-02-06 14:24:07
【问题描述】:

是否可以像在 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;

【问题讨论】:

  • public function Point()应该是public function __construct()

标签: php c++ class-template


【解决方案1】:

你能做的最好的就是 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 构造函数中执行完整性检查,确保两个参数共享相同的类型。

【讨论】:

  • 我只会传入 $argX$argY 而不输入类型 - PHP 是动态类型的,因此在这方面尝试复制 C++ 没有多大用处。如果您愿意,可以在构造函数中检查两个参数的类型是否相同(即,如果它们是对象,则检查它们的类是否匹配),如果不是,则抛出异常。
  • @CompuChip:他希望$x$y 成员是某种类型的实例化,分别使用$argX$argY 作为构造函数参数。如果不知道类型是什么,我看不出你怎么能做到这一点。除非他只是简单地使用他已经开始使用的代码......
  • 他写了$objA = new Point(new SomeClass(1), new SomeClass(2));作为例子,所以传入实例化的对象。您所要做的就是检查它们是否属于同一类型。
  • @CompuChip:你读过这个问题吗?你应该阅读这个问题。特别是他试图模仿的 C++ 示例。 (请注意,我必须在我的 PHP 示例中重新实现他的 C++ 示例中 ctor args 中的隐式转换)不过,请随意编写自己的对比答案!
  • 我阅读了这个问题,注意到 C++ 代码正确地代表了您在 C++ 中执行此操作的方式,然后指出 C++ 和 PHP 是完全不同的语言,因此您在 PHP 中执行此操作的方式一般是不同的。由于您最初写道“我不确定我会推广这种代码风格”,并且您已经将我的评论要点添加到您的答案中以提供替代方案,因此我认为没有必要提供另一个答案只是重申你的最后一行:)我认为这一点已经提出,OP应该自己决定,或者如果他愿意,可以要求澄清。
猜你喜欢
  • 2010-11-08
  • 2017-11-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多