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

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

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

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

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

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

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

$variable ?= 'default value';

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

<?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

Ответ 4

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

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

Ответ 5

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

Поскольку создание новых операторов предполагает создание собственной версии 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' );

EDIT:

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

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

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

Ответ 6

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

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