Это работает для меня:
function removeDirectory($path) {
$files = glob($path . '/*');
foreach ($files as $file) {
is_dir($file) ? removeDirectory($file) : unlink($file);
}
rmdir($path);
return;
}
Нет действительно никакого ненеоднозначного, объективного определения для них. Вот то, как я определил бы их:
Императив - фокус включен, что ступает, компьютер должен взять, а не что компьютер будет делать (напр. C, C++, Java).
Описание - фокус включен, что должен сделать компьютер, а не как это должно сделать это (напр. SQL).
Функциональный - подмножество декларативных языков, которое имеет тяжелое внимание на рекурсию
Я думаю, что Ваша таксономия является неправильной. Существует два противоположных императива типов и описание. Функциональный просто подтип описания. BTW, Википедия указывает тот же факт.
Вкратце:
императивный язык specfies ряд инструкции, что компьютер выполняется в последовательности (делают это, затем сделайте это).
А декларативный язык объявляет ряд правил о том, из чего должны следовать выводы, какие исходные данные (например, если у Вас есть A, тогда результатом является B). Механизм применит эти правила к исходным данным и даст вывод.
А функциональный язык объявляет ряд математических / логических функций, которые определяют, как введенный переводится в выходной. например, f (y) = y * y. это является типом декларативного языка.
Короче говоря, чем больше в стиле программирования делается акцент на том, что (делать), абстрагируясь от деталей того, как (делать)), тем больше этот стиль считается декларативным. Обратное верно для императива. Функциональное программирование связано с декларативным стилем.
Декларативное программирование - это программирование, выражающее некоторую вневременную логику между входом и выходом, например, в псевдокоде следующий пример был бы декларативным:
def factorial(n):
if n < 2:
return 1
else:
return factorial(n-1)
output = factorial(argvec[0])
Мы просто определили здесь отношение, называемое "факториал", и определили отношение между выходом и входом как это отношение. Как должно быть очевидно, практически любой структурированный язык в той или иной степени допускает декларативное программирование. Центральной идеей декларативного программирования является неизменяемость данных: если вы присваиваете переменную, то делаете это только один раз, и больше никогда. Другие, более строгие определения подразумевают, что побочных эффектов может вообще не быть, такие языки иногда называют "чисто декларативными".
Тот же результат в императивном стиле будет выглядеть так:
a = 1
b = argvec[0]
while(b < 2):
a * b--
output = a
В этом примере мы не выражали никаких вневременных статических логических отношений между входом и выходом, мы меняли адреса памяти вручную, пока один из них не давал желаемого результата. Должно быть очевидно, что все языки в той или иной степени допускают декларативную семантику, но не все допускают императивную, некоторые "чисто" декларативные языки вообще допускают побочные эффекты и мутацию.
Часто говорят, что декларативные языки определяют "что должно быть сделано", в отличие от "как это сделать", я думаю, что это неверное название, декларативные программы все еще определяют, как нужно добраться от входа к выходу, но другим способом, отношения, которые вы определяете, должны быть эффективно вычислимыми (важный термин, поищите его, если не знаете). Другой подход - это недетерминированное программирование, которое действительно просто определяет, каким условиям должен удовлетворять результат, прежде чем ваша реализация просто исчерпает все пути методом проб и ошибок, пока не добьется успеха.
К чисто декларативным языкам относятся Haskell и Pure Prolog. Скользящая шкала от одного к другому выглядит следующим образом: Pure Prolog, Haskell, OCaml, Scheme/Lisp, Python, Javascript, C--, Perl, PHP, C++, Pascall, C, Fortran, Assembly