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

所有动态语言都支持鸭子打字吗? 我认为PHP支持duck typing。是这样的吗?     
已邀请:
任何动态类型的oop语言都支持duck-typing,包括php。 这不是一个功能,而是编程风格。     
静态类型意味着一旦定义了变量,它就会在其生命周期内保持相同的类型。静态语言通常要求您声明类型,但有些具有类型推断 - 它们将从定义中推断出类型。例如,在scala中,您可以编写
i = 1
,编译器会将
i
的类型推断为
int
,但是您不能声明
i = "1"
,这将引发错误。 动态类型意味着您不必声明变量的类型,并且可以更改变量的类型。在红宝石中,你可以跟
i = 1
i = "1"
,完全没有问题。 Duck typing是一个不同的概念,几乎只适用于面向对象的语言。在使用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
我不知道你为什么要这样做,但这是语言设计师可以选择的。     
是的,PHP是一种鸭式语言。
$x = 1;
$x = 'string';
$x = new Person;
$x = 1 / 2;
    

要回复问题请先登录注册