Чому підписи функції PHP настільки непослідовні? [зачинено]


17

Я переглядав деякі функції 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 чи будь-яка мова з цього питання вважати послідовними підписи відповідних функцій?


2
+1 браво, це одне з перших речей, які я помітив про php і завжди вважав себе дратівливим
Кевін

Мех. Використовуйте IDE.
Бен Дубюссон

Відповіді:


10

Що ви пропонуєте, це по суті зміна підписів до багатьох існуючих функцій. Подумайте на хвилину, який ефект буде мати існуючий код. Тепер припустимо, що група PHP випустила PHP версії N, яка змінює підписи 30% функцій. Тепер уявіть, що ви повинні написати код, який працює як на PHP vN, так і на PHP v. {N-1} - наскільки це було б весело?

А тепер уявіть, що ви хостер або корпоративний менеджер центрів обробки даних - який стимул ви могли б підтримати PHP vN, за умови, що як тільки ви переключитесь, весь код буде порушений, і користувачі прийдуть до вашого офісу з вилами та факелами?


4
+1 Важко, коли ви почали щось не так, але мати таку велику базу користувачів, використовуючи її в поточному стані.
Енді Флемінг

4
Це хороший момент. Я насправді про це усвідомлював, але головна моя думка - вони повинні були знати про це в першу чергу.
Шамім Хафіз

7
@Shamim True, що є частиною того, чому PHP має погану репутацію в першу чергу;)
Енді Флемінг

1
PHP, як і стільки речей, почався як маленький інструмент для вирішення крихітної проблеми, якби хтось створив її «належним чином» назад, тоді це може бути приємніше ніж, але, можливо, не досяг би тяги, тому ніхто не використовував би її ... і ще один невеликий інструмент "виграв би", інструмент з різними невідповідностями ...
johannes

3
Ось чому існує таке поняття, як депресія. Ви створюєте нові, стандартизовані назви та знецінюєте старі "салатниці" імен функцій, але залишаєте їх на кілька випусків. У якийсь широко розрекламований момент ви виходите з новою основною версією версії, яка не усуває їх. Ось як це робиться. Це чиста боягузтво з боку розробників PHP, що вони цього не робили. Вони їдуть з низьким бар'єром для входу, який дає PHP перевагу перед іншими мовами в Інтернеті, і вони успішні через це, тому їм НЕ МАЄ продовжувати вдосконалювати основну мову.
Dan Ray

10

Тому що PHP - це мова без будь-яких специфікацій.

І буквально кожен міг додати пару функцій, а про узгодженість на початку не було. Так, безлад.


не всі можуть додавати функції
StasM

@StasM: Хто може, група DEV? Будь-яке посилання, де я можу знайти, як працює ця група?
Шамім Хафіз

@StasM: гаразд, я трохи перебільшував. реальною проблемою є відсутність конвенцій з самого початку або одна людина, відповідальна за згуртованість коду. Зараз уже пізно. Я сумніваюся, чи можна це змінити, не досліджуючи буквально PHP як іншу мову.
ts01

@Shamim Dev групових принципів роботи два: консенсус та конфіденційність. Що класно, але я боюся, що недостатньо для хорошого розвитку мови
ts01

@Shamim: почніть з php.net та wiki.php.net.
StasM

4

Більшість хороших мов є і прагнуть бути послідовними.

Це просто реальність держави PHP. Як згадував StasM, спробувати переключити такі речі після факту було б кошмаром. Це вплине на занадто багато існуючого коду. Часто PHP просто знімає функції та створює новіші кращі функції, які є більш послідовними, але це може зайняти багато часу.

Я думаю, що успішні програмісти PHP або запам'ятовують певний синтаксис, або використовують програмне забезпечення, яке автоматично повідомляє їм синтаксис.


функція знецінення - це одне, легке. Змінити порядок аргументів важче, складніше
ts01

@ ts01 цвяхи - головна проблема. Маючи лише позиційні параметри, немає жодного способу знати, що foo(a,b)тепер має існувати, foo(b,a)оскільки хтось змінив підпис foo.
Френк Ширар

@ TS01, @Frank: Ви повинні були б змінити назву функції, теж ... не особливо гарна ідею речі , як «property_exists» там , де НЕ немає іншого пристойного імені. Особисто мені хотілося б, щоб масиви стали фактичними об’єктами, щоб ви могли сказати, $array->key_exists('whatever')але, мех :-)
Дін Хардінг

Насправді, те, що може зробити будь-який розробник PHP, - це створити свої власні нові функції, щоб обернути їх. Зауважте також, що isset () має універсальний синтаксис для обох згаданих прикладів, але вони просто не застаріли як частина складених специфікацій.
user1122069

3

Основним джерелом невідповідності є те, що багато (більшість?) Php вбудованих функцій справді обгортки навколо якоїсь бібліотеки С. Первісне мислення було "Я завершую функцію C xxxx, тому я повинен тримати параметр однакового". Коли мова зайшла про написання функції "чистого php", це мислення було розширено на "xxxx бере файл і параметри, нова функція приймає ім'я файлу та параметри, тому має сенс" yyyy "приймати ті самі параметри в тому ж порядку.

Великий недолік тут полягає в тому, що основні бібліотеки С були для початку дуже непослідовними.


Вони також зберігали назви функцій C, які вони загортали в деяких випадках (зокрема, функції str), в той же час дико розходячись від умов імен C (таких як вони) для інших імен функцій.
Dan Ray

2

Причиною (a?) Стало залишатися сумісним з попередніми версіями PHP. Замість зміни назв функцій, які б порушили багато програм, функції залишаються. Однак, за інтуїцією, так, послідовне іменування функцій слід враховувати для нових мов.

Я повинен не погодитися з вами на те, що витрачається час на розвиток. Навчання PHP може зайняти більше часу, щоб зрозуміти найменування певних функцій, але після того, як освоїти (або принаймні усвідомити), це стає проблемою.

Сумісність> Послідовність (принаймні PHP)


1
Інші мови я можу писати без постійного посилання на документи. PHP Мені завжди доводиться турбуватися ... чи ця функція написана "str_" чи просто "str"? Це "масив _" - щось чи ми не згадуємо масиви? Що робить "length ()", коли вводиться рядок? Ой чорт, ні, це "strlen ()" Мені дуже хотілося ... Це "голка, стог сіна" чи "стог сітка"? Жодна інша мова не підводить мене до всього цього.
Dan Ray

Як ви мене постійно турбував цей @DanRay. Я почав використовувати NetBeans PHP IDE зараз, хоча це дає мені точну інформацію, яка мені потрібна прямо в редакторі.
de020239
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.