1

所有动态语言都支持鸭式打字吗?

我认为 PHP 支持鸭子类型。是这样吗?

4

3 回答 3

5

任何动态类型的 oop 语言都支持鸭子类型,包括 php。

这不是功能,而是编程风格。

于 2011-04-09T14:09:23.213 回答
3

静态类型意味着一旦你定义了一个变量,它在它的生命周期内保持相同的类型。静态语言通常要求您声明类型,但有些具有类型推断——它们会从定义推断类型。例如,在 scala 中,您可以编写i = 1并且编译器将推断出的类型iint,但您不能随后声明i = "1",这将引发错误。

动态类型意味着您不必声明变量的类型,您可以更改变量的类型。在ruby中,你可以follow i = 1with i = "1",完全没有问题。

鸭子类型是一个几乎完全适用于面向对象语言的不同概念。在使用 Duck 类型的语言中,不会检查方法的参数的类型,因此您传递给方法的任何类型都是可以接受的,只要它响应它收到的任何调用。

因此,例如:

class Duck
  def quacks
    puts "Quack"
  end
end

class FauxDuck
  def quacks
    puts "FauxQuack"
  end
end

def quacker duck
  duck.quacks
end

quacker 方法将采用 Duck 或 FauxDuck,因为两者都会响应.quacks

虽然大多数面向对象的动态类型语言也是鸭子类型的,但这不是必需的。您可以使用一种语言来为方法调用声明类型并强制执行它们,但仍然是动态类型的——请记住,动态类型只是意味着您可以在定义对象后更改它的类型。

在假设的非鸭型红宝石中

class Duck
  def quacks
    puts "Quack"
  end
end

class FauxDuck
  def quacks
    puts "FauxQuack"
  end
end

def quacker Duck duck
  duck.quacks
end

duck = Duck.new
quacker.duck ## no error
duck = FauxDuck.new ##redefining the type of the variable
quacker.duck ## throws an error at runtime

我不知道你为什么要这样做,但它是语言设计者可以选择的。

于 2015-02-06T00:00:34.260 回答
-3

是的,PHP 是一种鸭式语言。

$x = 1;
$x = 'string';
$x = new Person;
$x = 1 / 2;
于 2011-04-09T13:50:10.410 回答