如何在PHP中创建新的运算符?

时间:2011-06-14 17:41:24

标签: php operators

我发现自己在PHP上使用以下代码进行默认分配

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

我知道用5.3我可以做到

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

我想通过能够做到

来进一步简化它
$variable ?= 'default value';

并重新分配变量,以防它的计算结果为false。是否可以创建该作业?我是否必须编译自己的php版本才能做到这一点?

6 个答案:

答案 0 :(得分:20)

如果不更改PHP源代码,则无法在PHP中创建新运算符。

你不想改变它,相信我。当然,它很容易 - PHP是开源的并使用你可以轻松修改的straightforward LALR(1) parser - 但这会使你的代码与标准的PHP实现不兼容。因此,您将非常限制谁可以运行代码 - 这可能是除了您之外的任何人,因为没有其他人会关心修改他们的PHP引擎只是为了运行您的代码。

更新:我写了一篇关于如何向PHP添加新语法(如运算符)的小教程:http://nikic.github.com/2012/07/27/How-to-add-new-syntactic-features-to-PHP.html

答案 1 :(得分:1)

在PHP中,您无法创建运算符或重载现有运算符,例如=

您可以查看包Operator,但是,您的代码将无法通过它运行。

答案 2 :(得分:0)

你可以使用一个功能:

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

答案 3 :(得分:0)

您不能在PHP中执行此操作,而不能使用此语法。

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

答案 4 :(得分:0)

在想知道是否可以创建新操作时,这似乎是最常见的一个例子。我个人认为?=会非常方便。

由于创建新的运算符会涉及创建自己的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;}

答案 5 :(得分:0)

简单,php是一个php预处理器,只需预处理包含运算符的php文件,将所需的所有运算符转换为它的底层表示。

否则很遗憾php不是perl / lisp所以你不能简单地在运行时将语言扩展到那个程度