2011-04-09 36 views

回答

6

任何动态型OOP语言支持鸭打字,包括PHP。

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

+0

鸭子打字绝对是一种语言功能,而不是编程风格。动态类型化语言*可以*声明和强制方法调用的类型,如果它确实,那么它将不支持鸭子打字。 – philosodad 2015-04-02 20:12:08

-2

是的,PHP是鸭子型语言。

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

第一个问题呢? – Gumbo 2011-04-09 13:58:24

+3

这不是关于鸭子打字,'$ duck-> quack()'是(不关心鸭子的实际类别就是它可以嘎嘎声) – 2011-04-09 14:11:29

0

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

动态类型意味着您不必声明变量的类型,并且可以更改变量的类型。在红宝石中,您可以使用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将采取无论是鸭或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 

为什么你会想这样做,我不知道,但它是提供给语言设计者选择。