【发布时间】:2015-02-06 08:00:34
【问题描述】:
所有动态语言都支持duck typing吗?
我认为 PHP 支持鸭子类型。是这样吗?
【问题讨论】:
标签: php types duck-typing
所有动态语言都支持duck typing吗?
我认为 PHP 支持鸭子类型。是这样吗?
【问题讨论】:
标签: php types duck-typing
任何动态类型的 oop 语言都支持鸭子类型,包括 php。
这不是功能,而是编程风格。
【讨论】:
静态类型意味着一旦你定义了一个变量,它就会在它的生命周期内保持相同的类型。静态语言通常要求您声明类型,但有些具有类型推断——它们会从定义推断类型。比如在scala中,你可以写i = 1,编译器会推断i的类型是int,但是你不能再声明i = "1",那样会报错。
动态类型意味着您不必声明变量的类型,您可以更改变量的类型。在ruby中,你可以关注i = 1和i = "1",完全没有问题。
Duck 类型是一个几乎完全适用于面向对象语言的不同概念。在使用 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;
【讨论】:
$duck->quack() 是(不关心 $duck 的实际类别,只是它会嘎嘎)