Pozwolę sobie dodać linka do mojego posta: PHP7 czy warto?
Wiemy o wadach PHP: o tym, że jest słabo typowany, o bałaganie w nazewnictwie. Porozmawiajmy jednak o różnicach, bardziej merytorycznie, mniej emocjonalnie.
Wydajność: PHP7 nieźle przyspieszało. Jest szybsze od Python 2 oraz Python 3. Jeżeli oczekujesz od Pythona wydajności, może powinieneś pomyśleć o PyPy - alternatywnej implementacji języka Python.
Niekonsekwencje w nazewnictwie: Jasne, w PHP niektóre funkcje stosują podkreślenie (_
) a niektóre pisane razem. Czyli mamy np. strpos()
oraz in_array()
. Weźmy teraz Python. Wiele metod czy funkcji pisanych jest małymi literami, bez znaku podkreślenia, bez camel case. Przykład: "foo".isalpha()
. Mimo wszystko mamy coś takiego jak PEP, który zaleca standard nazewnictwa metod i funkcji. Zaleca on stosowanie podkreślenia w nazwach metod czy funkcji. Jednak biblioteka Pythona się do tego nie stosuje (pewnie zaszłości historyczne) i mamy metody pisane łącznie. Z drugiej strony mamy np. metodę is_integer()
która jak widzicie - już stosuje znak podkreślenia. Mamy tutaj niekonsekwencje w nazewnictwie. Pomijam fakt, że w wielu bibliotekach nazwy metod pisane są za pomocą camel-case.
Atrybuty private
oraz protected
: W Python nie mamy tego typu słów kluczowych. Jeżeli chcemy, aby dane pole było prywatne, dodajemy przed nazwą znak _
informując innych programistów, że jest to pole prywatne. Jednak dla interpretera nadal będzie to pole publiczne. Co ciekawe, gdy użyjemy podwójnego znaku podkreślenia, sytuacja wygląda inaczej.
Kopiuj
class Foo:
def __init__(self):
self.__bar = 1
f = Foo()
print f.__bar
AttributeError: Foo instance has no attribute '__bar'
Interfejsy: Jak w Pythonie zadeklarować interfejs? Nie ma słowa kluczowego interface
. Trzeba za to importować moduł abc
. Niefajne to, nieintuicyjne.
Składnia: Niektórzy lubią, niektórzy nie. Ja osobiście preferuje składnie podobną do tej z C#. W Pythonie za to można pisać "ciekawe" jednolinijkowce: {k: v for k, v in self.__dict__.iteritems() if not isinstance(v, Foo)}.iteritems()
. Niektórzy chwalą, inni by powiedzieli że nieczytelne.
Dekoratory: Tego nie ma w PHP. Chcesz aby metoda była statyczna? W PHP używasz słowa kluczowego `static. W Python?
Kopiuj
class Foo:
@staticmethod
def bar():
return 'bar'
print Foo.bar()
Typehint: W PHP: function foo(int $a, string $b)
. W Python? Chyba w 3.x to dodali, tak?
Dziedziczenie: PHP umożliwia dziedziczenie po jednej klasie. Python po wielu. W PHP mamy za to coś takiego jak traits które mają rozwiązać problem braku dziedziczenia po wielu klasach:
Kopiuj
class Foo
{
use traitA, traitB;
}
Prostota: IMHO PHP jest prostsze dla newbie. Łatwiej jest jednak pisać "zły kod". Zły kod, tzw. spaghetti, czyli pomieszany kod HTML z PHP. Jeżeli zaczynacie przygodę z PHP, to od razu po opanowaniu podstaw, polecam zacząć pisać przy użyciu jakiegoś frameworka.
Rynek pracy: W PHP jest więcej ofert. Niestety wiele z nich to "klepanie stronek" z WordPress, Joomla. Niestety te produkty nie są dobrze napisane, jakość kodu jest dość niska. Na początek może i ok, ale osobom ambitnym szybko się znudzi.
O różnicach można by pisać i pisać... Dla jednego to, co wymieniłem, może być zaletą, a dla drugiego wadą.