深入理解PHP原理之錯(cuò)誤抑制與內(nèi)嵌HTML分析
更新時(shí)間:2011年05月02日 14:12:58 作者:
PHP支持內(nèi)嵌HTML的, 那么對于PHP文件中, PHP標(biāo)簽外的HTML會怎么處理呢? 它和直接輸出HTML有什么區(qū)別么?
PHP提供了一個(gè)錯(cuò)誤抑制符'@', 它是通過什么方式來阻止錯(cuò)誤輸出呢? 我又該在什么時(shí)候使用它呢?
這是這倆天一些網(wǎng)友提到的共同問題, 今天就索性整體回答下, 備后來人翻閱.
PHP文件內(nèi)嵌HTML的處理方式
在PHP中, 所有在標(biāo)簽外的字符, 在詞法分析過程中, 都會翻譯成T_INLINE_HTML token, 在語法分析的時(shí)候, 所有的T_INLIE_HTML都會被分配ZEND_ECHO輸出.
也就是說:
<?php
while($con) {
?>
laruence
<?php
}
?>
會生成一條OPLINE: T_ECHO, 而操作數(shù)是”laruence”;
就結(jié)果來說, 上面的代碼, 其實(shí)和下面的結(jié)果一樣:
<?php
while($con) {
echo "laruence";
}
?>
但有一個(gè)要注意的地方是, 對于PHP標(biāo)簽外的字符, 在詞法分析過程中, 都會以400個(gè)字符為單位切分, 比如:
<?php
if(1) {
?>
laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence
<?php
}
?>
上面的代碼中, 標(biāo)簽外有531個(gè)字符(包含空格回車), 會被分成倆條T_INLINE_HTML輸出.
錯(cuò)誤抑制符
我們知道,在PHP中,可以通過錯(cuò)誤抑制符來靜默錯(cuò)誤提示, 那么它是通過什么方式呢?
在語法分析的過程中, 對于:
<?php
@include('file');
?>
會分別在include語句前后插入倆條Opline(操作), 這倆個(gè)操作分別做:
1. 保存當(dāng)前的error_reporting值, 并設(shè)置error_reporting(0); //關(guān)閉錯(cuò)誤輸出
2. 恢復(fù)之前保存的error_reporting值
也就是說, 其實(shí)上面的代碼, 和下面的代碼類似:
$old = error_reporting(0);
include('file');
error_reporting($old);
另外, 講一句題外話:”什么時(shí)候才應(yīng)用錯(cuò)誤抑制呢?”, 我個(gè)人建議, 就是如果這條語句出錯(cuò)了對你影響不大, 你也不關(guān)心這個(gè)錯(cuò)誤是什么, 你也不會安排額外的邏輯來處理這種錯(cuò)誤, 那么你可以使用錯(cuò)誤抑制. 否則, 請你使用額外的邏輯來判斷錯(cuò)誤.
這是這倆天一些網(wǎng)友提到的共同問題, 今天就索性整體回答下, 備后來人翻閱.
PHP文件內(nèi)嵌HTML的處理方式
在PHP中, 所有在標(biāo)簽外的字符, 在詞法分析過程中, 都會翻譯成T_INLINE_HTML token, 在語法分析的時(shí)候, 所有的T_INLIE_HTML都會被分配ZEND_ECHO輸出.
也就是說:
復(fù)制代碼 代碼如下:
<?php
while($con) {
?>
laruence
<?php
}
?>
會生成一條OPLINE: T_ECHO, 而操作數(shù)是”laruence”;
就結(jié)果來說, 上面的代碼, 其實(shí)和下面的結(jié)果一樣:
復(fù)制代碼 代碼如下:
<?php
while($con) {
echo "laruence";
}
?>
但有一個(gè)要注意的地方是, 對于PHP標(biāo)簽外的字符, 在詞法分析過程中, 都會以400個(gè)字符為單位切分, 比如:
復(fù)制代碼 代碼如下:
<?php
if(1) {
?>
laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence laruence
<?php
}
?>
上面的代碼中, 標(biāo)簽外有531個(gè)字符(包含空格回車), 會被分成倆條T_INLINE_HTML輸出.
錯(cuò)誤抑制符
我們知道,在PHP中,可以通過錯(cuò)誤抑制符來靜默錯(cuò)誤提示, 那么它是通過什么方式呢?
在語法分析的過程中, 對于:
復(fù)制代碼 代碼如下:
<?php
@include('file');
?>
會分別在include語句前后插入倆條Opline(操作), 這倆個(gè)操作分別做:
復(fù)制代碼 代碼如下:
1. 保存當(dāng)前的error_reporting值, 并設(shè)置error_reporting(0); //關(guān)閉錯(cuò)誤輸出
2. 恢復(fù)之前保存的error_reporting值
也就是說, 其實(shí)上面的代碼, 和下面的代碼類似:
復(fù)制代碼 代碼如下:
$old = error_reporting(0);
include('file');
error_reporting($old);
另外, 講一句題外話:”什么時(shí)候才應(yīng)用錯(cuò)誤抑制呢?”, 我個(gè)人建議, 就是如果這條語句出錯(cuò)了對你影響不大, 你也不關(guān)心這個(gè)錯(cuò)誤是什么, 你也不會安排額外的邏輯來處理這種錯(cuò)誤, 那么你可以使用錯(cuò)誤抑制. 否則, 請你使用額外的邏輯來判斷錯(cuò)誤.
您可能感興趣的文章:
- 淺析php中常量,變量的作用域和生存周期
- 關(guān)于PHP5 Session生命周期介紹
- 深入理解PHP之OpCode原理詳解
- PHP的運(yùn)行機(jī)制與原理(底層)
- PHP內(nèi)核探索:哈希表碰撞攻擊原理
- PHP中的插件機(jī)制原理和實(shí)例
- 深入理解PHP原理之Session Gc的一個(gè)小概率Notice
- 理解php原理的opcodes(操作碼)
- 深入理解PHP原理之異常機(jī)制
- PHP原理之異常機(jī)制深入分析
- PHP STRING 陷阱原理說明
- 修改Zend引擎實(shí)現(xiàn)PHP源碼加密的原理及實(shí)踐
- 深入理解PHP原理之執(zhí)行周期分析
相關(guān)文章
解決ThinkPHP下使用上傳插件Uploadify瀏覽器firefox報(bào)302錯(cuò)誤的方法
這篇文章主要介紹了解決ThinkPHP下使用上傳插件Uploadify瀏覽器firefox報(bào)302錯(cuò)誤的方法,需要的朋友可以參考下2015-12-12基于php雙引號中訪問數(shù)組元素報(bào)錯(cuò)的解決方法
下面小編就為大家分享一篇基于php雙引號中訪問數(shù)組元素報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02簡介WordPress中用于獲取首頁和站點(diǎn)鏈接的PHP函數(shù)
這篇文章主要介紹了WordPress中用于獲取首頁和站點(diǎn)鏈接的PHP函數(shù),分別是home_url()和site_url()需要的朋友可以參考下2015-12-12thinkphp中的多表關(guān)聯(lián)查詢的實(shí)例詳解
這篇文章主要介紹了thinkphp中的多表關(guān)聯(lián)查詢的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10php安全攻防世界unserialize函數(shù)反序列化示例詳解
這篇文章主要介紹了php的安全防護(hù),關(guān)于攻防世界Web php unserialize正則表達(dá)式反序列化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10php編程中echo用逗號和用點(diǎn)號連接的區(qū)別
本文通過幾個(gè)具體的例子.來認(rèn)清楚php編程中echo用逗號和用點(diǎn)號連接之前的區(qū)別.有需要的小伙伴可以參考下2016-03-03