在PHP类模板就像在C ++(Class template in PHP like in C++)

2019-10-19 07:22发布

是否有可能创建的PHP类模板,如C ++? PHP可能不会有类似的语言结构(如templateC ++中的关键词),但也许有一些聪明的技巧来实现类似的功能呢?

我有一个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;

Answer 1:

你能做的最好的是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构造,这两种观点共享相同的类型,如果你愿意的话。



文章来源: Class template in PHP like in C++