Как определить макрос с параметром в PHP как это возможно в C ++? - PullRequest
1 голос
/ 03 января 2011

Цель состоит в том, чтобы иметь что-то вроде:

#define sum( f1, f2 ) ( f1 + f2 )

, где

sum(2,2)

равно 4 в PHP.Это как-то возможно?Еще лучше было бы, если бы я мог вызвать:

$s = 'first';
APPEND ' and second';

, когда append будет определен как функция / метод / что-то еще, добавляемое к $s, поэтому после этих двух строк $s будет 'first ивторой.

Ответы [ 4 ]

3 голосов
/ 03 января 2011

Смысл макросов в C заключается в том, что они раскрываются во время компиляции.

Таким образом, использование макросов не влияет на скорость вашего кода, что будет иметь функция, выполняющая то же самое.

Следовательно, пример использования:

#define MYPRINTF(x) printf("MYPRINTF says : %s\n",x)
MYPRINTF("blah");

Приведенный выше код будет переведен компилятором непосредственно в:

printf("MYPRINTF says : %s\n","blah");

Весь смысл в том, что это быстрее, чем определение функции, такой как эта:

void myprintf(char *x)
{
  printf("myprintf says : %s\n","blah");
}

Поскольку нет никаких накладных расходов (в функции вам нужно поместить аргументы в стек и т. Д.).

В интерпретируемом языке, таком как PHP, вышеприведенное не выполняется, поскольку все выполняется непосредственно во время выполнения, поэтому использование механизма, подобного C #define, было бы абсолютно бесполезным - поэтому, чтобы ответить на ваш вопрос, вместо этого просто используйте обычные функции.

2 голосов
/ 03 января 2011

просто мысли из ваших комментариев

function withVeryLongWroteByAnIdiot() {
   ....
}

function xFunc() {
   return withVeryLongWroteByAnIdiot();
}
1 голос
/ 03 января 2011

PHP не поддерживает макросы в этом смысле (действительно вполне допустимый) аргумент. Я считаю, что между этим и обычной функцией в PHP нет большой разницы.

В конце концов, не имеет смысла иметь такую ​​концепцию в интерпретируемом во время выполнения языке.

0 голосов
/ 24 ноября 2015

Я не верю, что PHP поддерживает макросы.Если вы подумаете об этом, макросы в C не являются причудливыми константами, скорее константы - самые скучные макросы C в мире.PHP понимает скучную форму только через функцию определения .

Тем не менее, я не согласен с другими респондентами по поводу их обоснованности.Для них есть веская причина: когда вы хотите использовать встроенные функции для предварительной обработки чего-либо.Например:

macro default_if_empty_value(value, default) (empty(value) ? default : value)

Если вы попытаетесь написать это как функцию и вызвать ее:

default_if_empty_value($this->that['something']->or[$other], 'Not here.');

, вы получите предупреждение PHP, если какая-либо часть этой цепочки переменных будетне определено, и расширенную версию сложнее прочитать:

empty($this->that['something']->or[$other]) ? 'Not here.' : $this->that['something']->or[$other];

PHP-код скомпилирован , но он компилируется во время выполнения.Такой макрос может быть расширен интерпретатором PHP, а затем скомпилирован в байт-код PHP.Этот байт-код часто кэшируется интерпретатором PHP или надстройкой типа APC.

...