Я просматривал некоторые функции PHP и не мог не заметить следующее:
<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
Обратите внимание на array_key_exists()
и property_exists()
функцию. В первом случае имя свойства (ключ для массива) является первым параметром, а во втором - вторым параметром. Интуитивно можно ожидать, что они будут иметь аналогичную подпись. Это может привести к путанице, и время разработки может быть потрачено впустую, делая исправления такого типа.
Разве PHP или какой-либо другой язык не должны учитывать согласованность сигнатур связанных функций?
Ответы:
То, что вы предлагаете, - это существенное изменение подписей многих существующих функций. Подумайте на минуту, как это повлияет на существующий код. Теперь предположим, что группа PHP выпустила версию PHP N, которая изменяет подписи 30% функций. Теперь представьте, что вам нужно написать код, который будет работать как на PHP vN, так и на PHP v. {N-1} - насколько это будет весело?
Теперь представьте, что вы хостер или менеджер корпоративного центра обработки данных - какой стимул у вас будет для поддержки PHP vN, при условии, что после переключения весь код будет взломан, и пользователи придут в ваш офис с вилами и факелами?
источник
Потому что PHP это язык без каких-либо спецификаций.
И буквально каждый мог добавить пару функций, и в начале не было вопроса о последовательности. ТАК, беспорядок.
источник
Большинство хороших языков есть и стремятся быть последовательными.
Это просто реальность состояния PHP. Как упомянул StasM, было бы кошмаром попытаться поменять такие вещи после свершившегося факта. Это повлияет на слишком много существующего кода. Часто PHP просто отказывается от функций и создает новые более совершенные функции, которые более согласованы, но это может занять много времени.
Я думаю, что успешные программисты PHP либо помнят конкретный синтаксис, либо используют программное обеспечение, которое автоматически сообщает им синтаксис.
источник
foo(a,b)
теперь должен быть,foo(b,a)
потому что кто-то изменил подпись foo.$array->key_exists('whatever')
но, ме-хе :-)Основным источником несоответствия является то, что многие (большинство?) Из php встроенных функций действительно являются обертками вокруг некоторой библиотеки C. Первоначально я думал: «Я обертываю C-функцию xxxx, поэтому я должен сохранить порядок параметров таким же». Когда дело дошло до написания функции «чистого php», это мышление было расширено до «xxxx берет файл и параметры», новая функция принимает имя файла и параметры, поэтому имеет смысл, чтобы yyyy принимал те же параметры в том же порядке.
Большой недостаток заключается в том, что базовые библиотеки C были очень непоследовательными с самого начала.
источник
Причина (a?) Заключалась в том, чтобы оставаться совместимым с предыдущими версиями PHP. Вместо изменения имен функций, которые могут нарушить работу многих приложений, функции остаются. Тем не менее, интуитивно, да, согласованное именование функций должно учитываться для новых языков.
Я должен не согласиться с вами в том, что время разработки потрачено впустую. Изучение PHP может занять больше времени, чтобы понять наименование определенных функций, но после освоения (или, по крайней мере, осознания) это становится проблемой.
Совместимость> Согласованность (по крайней мере, для PHP)
источник