在 PHP 中,echo、print、die/exit、include/require、isset、empty、list、array 等關鍵字,雖然呼叫語法酷似函式,但本質上屬於 語言構造器。它們直接對應 Zend Engine 內部的 OPcode 指令,而非透過函式呼叫機制 (ZEND_DO_FCALL) 執行。
<?php
print 'Hello world';
// 編譯後產生 ZEND_ECHO 或 ZEND_PRINT opcode
// 無函式查找、無參數堆疊框架建立、無返回值處理 (print 除外)
?>
print('hello') 和 print 'hello' 等價,編譯器自動處理。$func = 'print'; $func('hello'); 會拋出 Error: Call to undefined function print()。<?php
function myPrint($str) { echo $str; }
$func = 'myPrint';
$func('hello'); // 正常執行:查找函式表 -> 建立堆疊 -> 執行 -> 銷毀堆疊
?>
PHP 的 可變函式 機制:$var() 會嘗試在函式表中查找名為 $var 字串值的函式。因為語言構造器不存在於函式表,所以無法透過此機制調用。
<?php
$func = 'print';
$func('test'); // Fatal Error: Uncaught Error: Call to undefined function print()
// 正確寫法:直接呼叫
print 'test';
// 或包裝成匿名函式
$func = function($s) { print $s; };
$func('test'); // OK
?>
| 關鍵字 | 功能 | 返回值 | 括號要求 |
|---|---|---|---|
echo | 輸出一或多字串 | 無 | 不可加括號 (語法錯誤) |
print | 輸出單一字串 | 永遠為 1 | 可選 |
die/exit | 終止腳本執行 | 無 (進程結束) | 可選 |
include/require | 包含並執行檔案 | include 返回 1/false; require 失敗致命錯誤 | 可選 |
isset/empty | 檢查變數狀態 | bool | 必須加括號 (特殊語法) |
list | 解構陣列賦值 | 陣列 | 必須加括號 |
array | 建立陣列 (PHP 5.4+ 可用 []) | 陣列 | 必須加括號 |
eval | 執行字串為 PHP 代碼 | mixed | 必須加括號 |
clone | 複製物件 | 物件 | 不可加括號 |
new | 實例化物件 | 物件 | 建構子需括號 |
echo、簡單判斷用 isset/empty。array_map(function($v){ return print $v; }, $arr); 或 array_map('print', $arr); // 錯誤!function echo() {} 會導致編譯錯誤 Cannot redeclare language construct。print 返回值特性:$a = print 'hi'; // $a === 1 可用於鏈式邏輯,但降低可讀性,不推薦。語言構造器是 PHP 語法的「保留字」,編譯器賦予其特殊語義與優化路徑。認清它們「非函式」的本質,能避開可變函式調用失效、效能誤判等坑點,寫出更符合引擎機制的高效代碼。