7 December 2008

PHP goni inne języki

Dzisiaj natknąłem się na artykuł o nowościach w PHP 5.3. Dobrze, że udało im się przepchnąć dwa istotne elementy (przestrzenie nazw i funkcje lambda/domknięcia). Postęp znaczący! Problem jednak w tym, że te slogany ładnie wyglądają na papierze, ale niestety czasem sprawią problemy, bo diabeł tkwi w szczegółach. Dwa przykłady:

  • importowanie przestrzeni nazw bez przedrostków działa dla klas, ale nie dla funkcji i stałych :(
  • funkcje lambda są zmiennymi ($ na początku), ale standardowe funkcje tak nie mają, więc jest ewidentne rozdwojenie wymuszające pisanie $test() zamiast test() :(

Może wyglądam na czepialskiego, ale to elementy mocno przeszkadzające, jeśli chce się na przykład utworzyć spójną bibliotekę o czystym API.

Funkcje lambda i domknięcia w Pythonie 2.x (na pocieszenie coś, czego w PHP jeszcze nie ma):

# Obiekty mogą zachowywać się jak funkcje...
# Pojawi się w PHP 5.3 (metoda __invoke)
class FunClass(object):

def __init__(self):
self._times_called = 0

def __call__(self, test1, test2):
self._times_called += 1
return test1 + test2

fun2 = FunClass()
print fun2._times_called
print fun2(1, 1)
print fun2._times_called

# Funkcje obsługują domknięcia...
# Pojawi się w PHP 5.3, jako dodatek do funkcji lambda.
def fun3(test1):
def fun3a(test2):
return test1 + test2
return fun3a

real_fun3 = fun3(3)
print real_fun3(5)

# Funkcje mogą mieć właściwości...
#
def fun1(test1, test2):
return test1 + test2

fun1.safe = False

if getattr(fun1, 'safe', False):
print fun1(1, 1)
else:
print "%s is not safe" % fun1.__name__

PS. Znających Pythona proszę o pominięcie ciszą stwierdzenia z artykułu, że "The biggest benefit namespaces will provide is shortening of long classnames.".

0 komentarze:

Post a Comment