2011-04-09 5 views

ответ

6

Любой динамически типизированный язык ООП поддерживает утку-типизации, включая PHP.

Это не особенность, это скорее стиль программирования.

+0

Duck Typing - это определенно языковая функция, а не стиль программирования. Динамически типизированный язык * может * объявлять и применять типы вызовов методов, и если бы это было так, то это не поддерживало бы утиную печать. – philosodad

-2

Да, PHP - это язык, утиный языком.

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

Как насчет первого вопроса? – Gumbo

+3

Речь идет не о duck-typing, '$ duck-> quack()' (не заботясь о том, что фактический класс $ duck как раз и может ошеломлять) –

0

Статическое типирование означает, что после того, как вы определили переменную, он останется прежним для своего срока службы. Статические языки обычно требуют, чтобы вы объявляли тип, но некоторые имеют тип вывода - они выведут тип из определения. Например, в 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 будет принимать либо утку или 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 

Почему вы хотели бы это сделать, я не знаю, но это выбор доступен для разработчиков языка.

Смежные вопросы