在 PHP 中不使用父类时是否称为多态性

Is it called Polymorphism when not using a parent class in PHP?

本文关键字:是否 多态性 父类 PHP      更新时间:2023-10-16

在C++中,如果我想使用多态性,我将创建一个父类,然后从父类派生许多子类,然后我将能够将子类对象的地址分配给父类的指针变量。

例如:假设我有一个名为Animal的父类,然后我从Animal中导出了两个子类,分别是DogCat,这三个类有一个叫speak()的方法。

现在我可以创建一个将Animal*作为参数的函数:

void foo(Animal* animal)
{
    animal->speak();
}

并执行以下操作:

Cat *cat = new Cat();
Dog *dog = new Dog();
foo(cat);
foo(dog);

但是在 PHP 中,变量可以是任何类型的,所以即使我没有父类Animal,只有一个Cat类和一个Dog类,我仍然可以执行以下操作:

function foo($animal)
{
    $animal->speak();
}
$cat = new Cat();
$dog = new Dog();
foo($cat);
foo($dog);

那么在不使用父类时它仍然称为多态性吗?

你在C++中描述的多态性是子类型(在这个链接的维基百科文章中三个不同含义的列表中第三个(。

这也被描述为(至少在C++这样的静态类型语言中(动态多态性,因为关键是对象的"动态"(运行时(类型与接口的"静态"编译时类型不同。

你在PHP中讨论的是鸭子类型,它本质上是一种参数化多态性。

这大致相当于您从C++中的模板中获得的静态多态性,尽管实现显然非常不同。

多态性是一个非常抽象的概念,特别是独立于任何特定的实现。从这个意义上说,是的,您的代码使用多态性。

现在,关于你与C++的比较,你在这里比较苹果和橙子。下面的 PHP 更接近C++代码:

function foo(Animal $animal)
{
    $animal->speak();
}

另一方面,您也可以调整C++代码:

template<typename animal_type>
void foo(animal_type& animal)
{
    animal.speak();
}

请注意,我已经修复了您的版本对指针的非惯用用法,但重要的是该函数现在是一个模板。