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

时间:2011-04-09 13:43:49

标签: php types duck-typing

所有动态语言都支持duck typing吗?

我认为PHP支持鸭子打字。是这样的吗?

3 个答案:

答案 0 :(得分:6)

任何动态类型的oop语言都支持duck-typing,包括php。

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

答案 1 :(得分:0)

静态类型意味着一旦定义了变量,它的生命周期就会保持相同的类型。静态语言通常要求您声明类型,但有些具有类型推断 - 它们将从定义中推断出类型。例如,在scala中,您可以编写i = 1,编译器会将i的类型推断为int,但您不能再声明i = "1",抛出错误。

动态类型意味着您不必声明变量的类型,并且可以更改变量的类型。在ruby中,您可以使用i = 1关注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

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

答案 2 :(得分:-3)

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

$x = 1;
$x = 'string';
$x = new Person;
$x = 1 / 2;