所有动态语言都支持duck typing吗?
我认为PHP支持鸭子打字。是这样的吗?
答案 0 :(得分:6)
任何动态类型的oop语言都支持duck-typing,包括php。
这不是一个功能,而是编程风格。
答案 1 :(得分:0)
静态类型意味着一旦定义了变量,它的生命周期就会保持相同的类型。静态语言通常要求您声明类型,但有些具有类型推断 - 它们将从定义中推断出类型。例如,在scala中,您可以编写i = 1
,编译器会将i
的类型推断为int
,但您不能再声明i = "1"
,抛出错误。
动态类型意味着您不必声明变量的类型,并且可以更改变量的类型。在ruby中,您可以使用i = 1
关注i = "1"
,并且完全没有问题。
所以,例如:
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;