2011-06-14 22 views
17

我看到自己在做下面的代碼默認分配新建分配FY在PHP如何在PHP中創建一個新的操作符?

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

我知道,與5.3我可以做

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

我想通過能夠進一步簡化所有類型只是做

$variable ?= 'default value'; 

並有變量重新分配,以防萬一它的計算結果爲false。是否可以創建該作業?我必須編譯我自己的PHP版本才能做到這一點嗎?

+4

我敢肯定你必須釀造自己的PHP版本做到這一點。 – GWW 2011-06-14 17:45:21

+0

提醒,只有你可以運行代碼,這依賴於這種自定義功能。你通常不會贏得任何東西,但是可能會有一些角色,也可能是一些煩人的消費者;)聯繫到php-internals郵件列表。也許這對於php核心來說是一件好事。 – KingCrunch 2011-06-14 17:46:41

+0

真棒是有什麼地方我們可以打開一個「請願書」,使其引起注意? – dynamic 2011-06-14 17:50:30

回答

18

你不能在不改變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

+0

垃圾,我很害怕。對於這一點,LUA太習慣了。無論如何,謝謝你的明確答覆。 – 2011-06-14 18:06:12

1

在PHP中,你不能創建操作員或重載現有運營商,如=

您可以檢查包裝Operator,但是,你的代碼將不會運行的withoud它。

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 
0

您不能在PHP中執行此操作,而不是使用此語法。

<? 
$test = array("3 is 5", "3 is not 5"); 
$r = $teste [+(3 != 5)]; 
echo $r; //return "3 is not 5" 
?> 
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;} 
0

它的簡單,PHP是一個PHP的預處理程序,只需你進行預處理PHP文件包含您的運營商來翻譯你想爲它的底層表示所有的運營商。

否則可悲的是PHP是不使用Perl /口齒不清,所以你不能簡單地在運行時擴展語言到那種程度

相關問題