Nowości z php.internals – makra

Kilka dni temu, Mathias Grimm, zgłosił na grupie php.internals propozycję dodania makr preprocesora do PHP. Miały by działać one analogicznie jak te w C, z wyjątkiem tego, że były by deklarowane za pomocą funkcji MACRO(‚nazwa_makra’,’jakas_tresc_makra’). Propozycja nie spotkała się raczej z entuzjastycznym przyjęciem. Oponenci argumentowali, że z racji na dynamiczną naturę języka dodanie makr nie wnosi żadnej nowej jakości i tylko zaciemnia kod dla osób nie zaznajomionych z nim. Wobec tego propozycja raczej nie przejdzie, chociaż widzę, że dyskusja się dość rozwinęła. Przy okazji tej dyskusji wyszło kilka ciekawych rzeczy, np. że jest rozszerzenie o nazwie „prep„, które tą obsługę wprowadza natywnie, oraz również mająca podobną funkcjonalność implementacja w czystym php. Z innych wartych odnotowania spraw, dowiedzieć się można, że używa się też gcc do takich rzeczy w formie:

<?php
#define PF private function
#define SCOPE_CLASS(x) class MyProject_ ## x

class UseMacro
{
     PF preSave($object)
     {
        //...
     }

}

SCOPE_CLASS(Internal)
{

}
?>

taki kod następnie należy przepuścić przez gcc komendą:

gcc -Mcpp -E - - < in.php > out.php

Widać kreatywność ludzka nie zna granic. Tak czy inaczej, ja osobiście uważam, że makra w php są zbędne, natomiast sądzę, że zamiast nich przydało by się wsparcie api dla rzeczy, które w tej chwili wykonuje się przy pomocy evala, np. anonimowe klasy, czy dynamiczne proxy.

Ciekaw jestem, jakie jest Wasze zdanie na ten temat ?

  1. Sebastian Tarach pisze:

    Funkcjonalność potrzebna jak świni siodło.

  2. Zyx pisze:

    Bezsens. Osoba, która to dodawała, chyba nie ma zielonego pojęcia czym makra są i dlaczego je się w ogóle stosuje w C/C++…

  3. Makra w C++ były bardzo przydatne, wbrew przedmówcom myślę, że przydałaby się taka funkcjonalność w PHP. Może nawet nie nazywajmy tego „makrami”, ale zwyczajnie przydałby się jakiś preprocesor, ew. żeby deklaracje define() miały nieco większą moc – właśnie w takich przypadkach, gdzie moglibyśmy sobie zadeklarować w nich kawałek kodu, który potem zostałby zinterpretowany jak zwyczajny element języka.

  4. Ok Tomasz, ale do czego chciałbyś tego użyć ? Bo szczerze to ja nie widzę zbytnio zastosowań. Do zadań specjalnych jest zawsze eval, który już wystarczająco zaciemnia kod :>

  1. There are no trackbacks for this post yet.

Leave a Reply

Informuj mnie o odpowiedziach poprzez e-mail. Możesz również subskrybować wpis bez zostawiania komentarza.