Как я могу создать новый оператор в PHP?

Я вижу, что я делаю следующий код для установки по умолчанию для всех типов на PHP

$variable = $variable ? $variable : 'default value'; 

Я знаю, что с 5.3 я могу сделать

 $variable = $variable ?: 'default value'; 

Я хотел бы еще больше упростить его, имея возможность просто сделать

 $variable ?= 'default value'; 

и переменная переназначается в случае, если она оценивает значение false. Возможно ли создать это задание? Нужно ли мне скомпилировать мою собственную версию php?

Solutions Collecting From Web of "Как я могу создать новый оператор в PHP?"

Вы не можете создавать новые операторы в PHP без изменения источника PHP.

И ты не хочешь меня менять, поверь мне. Конечно, это было бы достаточно просто – PHP является открытым исходным кодом и использует простой парсер LALR (1), который вы можете легко изменить, но это сделает ваш код несовместимым со стандартной реализацией PHP. Таким образом, вы очень ограничиваете, кто может запускать код, который, вероятно, будет никем от вас, так как никто другой не захочет модифицировать свой PHP-движок только для запуска вашего кода.

Обновление: я написал небольшой учебник о том, как добавить новый синтаксис (например, операторы) в PHP: http://nikic.github.com/2012/07/27/How-to-add-new-syntactic-features-to- PHP.html

В PHP вы не можете создавать операторы или перегружать существующие операторы, такие как = .

Вы можете проверить оператор пакета, но ваш код не будет запущен при его использовании.

Вы не можете сделать это в PHP, а не с этим синтаксисом.

 <? $test = array("3 is 5", "3 is not 5"); $r = $teste [+( 3 != 5)]; echo $r; //return "3 is not 5" ?> 

Вы можете использовать функцию:

 <?php function defvar(&$var) { if (empty($var)) { $var = 'default value'; } } // testing $set = 'test'; defvar($set); echo $set; defvar($notset); echo $notset; ?> 

Вывод:

 test default value 

Или, если вы предпочитаете назначение:

 <?php function setdefvar($var) { if (empty($var)) { return 'default value'; } else { return $var; } } // testing $set = 'test'; $set = setdefvar($set); echo $set; $notset = setdefvar($notset); echo $notset; ?> 

Вывод:

 test default value 

Похоже, что это единственный пример, который возникает, когда возникает вопрос, можно ли создавать новые операции. Я лично считаю, что? = Было бы очень удобно.

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

 /** * Global function to simplify the process of * checking to see if a value equates to true * and setting it to a new value if not. * * @param mixed $var the original variable to * check and see if it equates to true/false * @param mixed $default the default value to * replace the variable if it equates to false * * @return mixed returns the variable for * either further processing or assignment. */ function _d( &$var, $default ) { return $var = $var ?: $default; } 

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

 _d( $variable, 'default value' ); // $variable = $variable ?: 'default value'; $variable1 = _d( $variable, 'default value' ) . 's'; // $variable1 = ( $variable = $variable ?: 'default value' ) . 's'; _d( $variable, _d( $variable1, 'default value' ) ); // $variable = $variable ?: ( $variable1 = $variable1 ?: 'default value' ); 

РЕДАКТИРОВАТЬ:

В качестве дополнительной заметки функция также назначит значение по умолчанию для переменной, даже если она еще не определена.

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

 return $var = isset( $var ) ? $var : $default;} 

его простой, php является препроцессором php, просто предварительно обработайте ваш php-файл, содержащий ваш оператор, чтобы перевести всех операторов, которых вы хотите, в его основное представление.

иначе грустно php не perl / lisp, поэтому вы не можете просто расширить язык во время выполнения до такой степени