2011-04-09 34 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 

爲什麼你會想這樣做,我不知道,但它是提供給語言設計者選擇。