Dlaczego podpisy funkcji PHP są tak niespójne? [Zamknięte]

17

Przeglądałem niektóre funkcje PHP i nie mogłem nie zauważyć:

<?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)
?>

Zwróć uwagę na funkcję array_key_exists()i property_exists(). W pierwszym z nich nazwa właściwości (klucz do tablicy) jest pierwszym parametrem, natomiast w drugim jest drugim parametrem. Intuicyjnie można oczekiwać, że będą mieli podobny podpis. Może to prowadzić do zamieszania, a czas opracowywania może zostać zmarnowany przez wprowadzenie tego typu poprawek.

Czy PHP czy jakikolwiek inny język nie powinien rozważać spójności podpisów powiązanych funkcji?

Shamim Hafiz
źródło
2
+1 brawo, jest to jedna z pierwszych rzeczy, które zauważyłem w php i zawsze uważałem za denerwujące
Kevin
Meh Użyj IDE.
Ben Dubuisson

Odpowiedzi:

10

To, co proponujesz, zasadniczo zmienia sygnatury na wiele istniejących funkcji. Pomyśl przez chwilę, jaki wpływ miałby to na istniejący kod. Załóżmy teraz, że grupa PHP wydała wersję PHP N, która zmienia sygnatury 30% funkcji. Teraz wyobraź sobie, że musisz napisać kod działający zarówno na PHP vN, jak i PHP v. {N-1} - ile by to było zabawy?

Teraz wyobraź sobie, że jesteś hosterem lub korporacyjnym menedżerem centrum danych - jaką zachętę miałbyś wspierać PHP vN, pod warunkiem, że po zmianie cały kod zostanie uszkodzony, a użytkownicy przyjdą do twojego biura z widłami i pochodniami?

StasM
źródło
4
+1 Trudno jest, gdy zaczniesz coś źle, ale masz tak dużą bazę użytkowników, która używa tego w obecnym stanie.
Andy Fleming,
4
Trafne spostrzeżenie. Tak naprawdę byłem tego świadomy, ale przede wszystkim powinienem był to wiedzieć.
Shamim Hafiz
7
@Shamim True, co jest częścią tego, dlaczego PHP ma złą reputację;)
Andy Fleming
1
PHP, podobnie jak wiele innych rzeczy, zaczęło jako małe narzędzie do rozwiązania drobnego problemu. Gdyby ktoś zaprojektował go „poprawnie”, wówczas może być ładniejszy, ale może nie osiągnąłby przyczepności, więc nikt by go nie użył ... i inne małe narzędzie „wygrałoby”, narzędzie o różnych niespójnościach ...
John
3
Dlatego istnieje coś takiego jak deprecjacja. Tworzysz nowe, znormalizowane nazwy i przestajesz używać starego „paska sałatek” nazw funkcji, ale zostawiasz je na kilka wydań. W pewnym dobrze nagłośnionym punkcie pojawia się nowa główna wersja, która usuwa je. Tak to się robi. To czyste tchórzostwo ze strony deweloperów PHP, że tego nie zrobili. Osiągają niską barierę wejścia, która daje PHP przewagę nad innymi językami internetowymi i dzięki temu odnoszą sukcesy, więc nie muszą ciągle poprawiać podstawowego języka.
Dan Ray
10

Ponieważ PHP jest językiem bez żadnych specyfikacji.

I dosłownie każdy mógł dodać kilka funkcji i na początku nie było mowy o spójności. A więc bałagan.

ts01
źródło
nie każdy może dodawać funkcje
StasM
@StasM: Kto może, grupa DEV? Wszelkie linki, w których mogę znaleźć sposób działania tej grupy?
Shamim Hafiz
@StasM: ok, trochę przesadziłem. prawdziwym problemem jest brak konwencji od początku lub jedna osoba odpowiedzialna za spójność kodu. Teraz jest za późno. Wątpię, czy można to zmienić bez dosłownego rozwodzenia PHP jako innego języka.
ts01
@Shamim Dev zasady działania grupy są dwa: konsensus i zaufanie. Co jest fajne, ale obawiam się, że nie wystarcza do dobrego rozwoju języka
ts01
@Shamim: zacznij od php.net i wiki.php.net.
StasM
4

Większość dobrych języków jest i dąży do zachowania spójności.

To tylko rzeczywistość stanu PHP. Jak wspomniał StasM, koszmarem byłoby próba zmiany takich rzeczy po fakcie. Wpłynęłoby to na zbyt wiele istniejącego kodu. Często PHP po prostu zastępuje funkcje i tworzy nowsze, lepsze funkcje, które są bardziej spójne, ale mogą zająć dużo czasu.

Myślę, że odnoszący sukcesy programiści PHP albo pamiętają określoną składnię, albo używają oprogramowania, które automatycznie mówi im składnię.

Andy Fleming
źródło
funkcja przestarzała to jedna rzecz, łatwa. Zmiana kolejności argumentów jest trudniejsza
ts01
@ ts01 przybija zasadniczy problem. Przy tylko parametrach pozycyjnych nie ma sposobu, aby wiedzieć, że twój istniejący foo(a,b)powinien być teraz, foo(b,a)ponieważ ktoś zmienił podpis foo.
Frank Shearar,
@ TS01, @Frank: Trzeba zmienić nazwę funkcji, zbyt ... nie jest to szczególnie dobry pomysł na rzeczy jak „property_exists” Tam gdzie jest żadna inna nazwa przyzwoity. Osobiście chciałbym zobaczyć, jak tablice stają się rzeczywistymi obiektami, więc można powiedzieć, $array->key_exists('whatever')ale:
Dean Harding
W rzeczywistości każdy programista PHP może stworzyć własne nowe funkcje do ich owijania. Zauważ też, że isset () ma uniwersalną składnię dla obu wymienionych przykładów, ale po prostu nie są one przestarzałe jako część skompilowanej specyfikacji.
user1122069,
3

Głównym źródłem niespójności jest to, że wiele (większość?) Wbudowanych funkcji php jest tak naprawdę owijanych wokół jakiejś biblioteki C. Początkowe myślenie brzmiało: „Zawijam funkcję C xxxx, dlatego powinienem zachować tę samą kolejność parametrów”. Jeśli chodzi o pisanie funkcji „czystego php”, to myślenie zostało rozszerzone na „xxxx bierze plik i opcje, nowa funkcja przyjmuje nazwę pliku i opcje, więc sensowne jest, aby yyyy przyjmował te same parametry w tej samej kolejności.

Wielka wada polega na tym, że leżące u podstaw biblioteki C były bardzo niespójne na początku.

James Anderson
źródło
Zachowali także nazwy funkcji C, które zawijali w niektórych przypadkach (w szczególności funkcje str), jednocześnie odbiegając od konwencji nazewnictwa C (takich jakimi są) dla innych nazw funkcji.
Dan Ray
2

Powodem (a?) Była zgodność z poprzednimi wersjami PHP. Zamiast zmieniać nazwy funkcji, które mogłyby uszkodzić wiele aplikacji, funkcje pozostają. Jednak intuicyjnie należy brać pod uwagę spójne nazewnictwo funkcji dla nowych języków.

Muszę się z tobą nie zgodzić, że marnuje się czas na rozwój. Nauka PHP może potrwać dłużej, aby zrozumieć nazewnictwo niektórych funkcji, ale po opanowaniu (lub przynajmniej uświadomieniu sobie) staje się to problemem.

Kompatybilność> Spójność (przynajmniej dla PHP)

Jesse
źródło
1
Inne języki, mogę pisać bez stałego odniesienia do dokumentów. PHP Zawsze muszę się martwić ... czy ta funkcja ma literę „str_” czy tylko „str”? Czy to „tablica _” - coś, czy nie wspominamy o tablicach? Co robi „length ()”, gdy podano ciąg? O cholera, nie, to jest „strlen ()” Naprawdę chciałem… Czy to „igła, stóg siana” czy „stóg siana, igła”? Żaden inny język nie pozwala mi przejść przez to wszystko.
Dan Ray
Tak jak ty ciągle niepokoiło mnie to @DanRay. Jednak zacząłem używać NetBeans PHP IDE, co daje mi dokładne informacje, których potrzebuję bezpośrednio w edytorze.
deed02392