Подтвердить что ты не робот

Как создать шаблоны цикла в php

Как мы можем определить шаблоны цикла в С++, чтобы сделать кодирование короче:

#define fo(a,b,c) for( a = ( b ); a < ( c ); ++ a )

Есть ли способ сделать то же самое в PHP?

4b9b3361

Ответ 1

Отказ от ответственности. Это не совсем макрос препроцессора, но из-за "динамического" характера PHP препроцессоры не нужны/не используются. Вместо этого вы можете обернуть функции в другие функции, как в приведенном ниже примере.

Да, вы можете сделать это, создав свою собственную функцию, которая передается также обратным вызовом. Вот пример:

// FO function
function fo($b, $c, $callback) {
    for ($a = $b; $a < $c; ++$a) {
        $callback($a);
    }
}

// example of usage
fo(2,10, function($a){
    echo '['.$a.']';
});

Вышеприведенный код работает в PHP 5.3 и выводит следующее:

[2][3][4][5][6][7][8][9]

Ответ 2

К счастью, нет. Есть много ужасных вещей, которые вы можете сделать, чтобы сделать нечитаемый PHP, но это не один из них.

PHP не использует препроцессор по умолчанию. Будучи динамичным языком, для него не существует шага сборки, который должен выполняться как часть. Существуют предварительные процессоры сторонних производителей, которые можно использовать как CCPP, и, конечно же, вы можете писать свои собственные, но они, вероятно, изменятся ваши рабочие процессы значительно.

Интересным препроцессором для PHP был PiHiPi, который пытался добавить полезные функции к языку вроде синтаксиса массива JSON, а не требовать писать array() каждый раз. К сожалению, автор потянул его.

Ответ 3

Как насчет чего-то типа:

function my_macro($a, $b, $c) {
  $args = func_get_args();
  array_shift($args);
  array_shift($args);
  array_shift($args);

  return call_user_func_array("something_horrifically_long_involving_{$a}_{$b}_and_{$c}", $args);
}

Ответ 4

CCPP, кажется, самая близкая вещь:

#define macroFunction(op1,op2,op3) ((int)op1/((int)op2+(int)op3))
#define hash_hash # ## #
#define showCExamples 1

#if showCExamples
//Reference: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation
#define MYCASE(item,id) \
case id: \
  item##_##id = id;\
break

switch(x) {
    MYCASE(widget,23);
}