php中的錯誤處理機制(php異常處理機制)

本文目錄一覽:

php實際開發怎麼處理錯誤

在php開發過程中,由於不知道向誰求助而心慌意亂地判斷以為自己不適合學php。其實錯誤在每個人學習過程中都會碰到的,千萬不要妄自菲薄。很多錯誤在報錯的代碼提示中已經告訴我們了,仔細看,不會就百度。現總結一些常見的php錯誤,以共享php新人。

Php常見錯誤提示

一、Fatal error: Call to undefined function……

函數不存在,可能的原因:

1、系統不存在這個函數且你也沒自定義

2、有人會問,我在別的機器上就不報錯。那是因為環境不同,這個函數在本機沒開,怎麼開?你百度函數名字,就能查到這個函數屬於哪個dll,去php.ini里開啟。

實例講解:PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解決辦法

在一台處理網絡支付的服務器遷移的時候,發現不能支付。

PHP環境:

PHP版本為5.3.3

系統為Red Hat 4.1.2-54

查看apache的錯誤日誌,發現是加密文件中一個函數bcmul()報錯:

複製代碼 代碼如下:PHP Fatal error: Call to undefined function bcmul() in /php_rsa.php on line xxx

解決辦法:

使用如下命令:

複製代碼 代碼如下:yum install php-bcmath

就安裝好了。

如果出現下面這種情況:

複製代碼 代碼如下:

Loaded plugins: fastestmirror

Loading mirror speeds from cached hostfile

* base: mirrors.yun-idc.com

* extras: mirrors.yun-idc.com

* rpmforge:

* updates: mirrors.yun-idc.com

Setting up Install Process

Resolving Dependencies

— Running transaction check

— Package php-bcmath.x86_64 0:5.1.6-40.el5_9 set to be updated

— Processing Dependency: php-common = 5.1.6-40.el5_9 for package: php-bcmath

— Running transaction check

— Package php-common.x86_64 0:5.1.6-40.el5_9 set to be updated

— Processing Conflict: php53-common conflicts php-common

— Finished Dependency Resolution

php53-common-5.3.3-13.el5_9.1.x86_64 from installed has depsolving problems

— php53-common conflicts with php-common

Error: php53-common conflicts with php-common

You could try using –skip-broken to work around the problem

You could try running: package-cleanup –problems

package-cleanup –dupes

rpm -Va –nofiles –nodigest

就需要使用yum update 之後再yum install php53-bcmath就好了

順便了解了一下,bcmath這個函數是PHP數學擴展中的一個。可以使用 bcscale() 來設置全局默認的小數位數,具體用法如下:

複製代碼 代碼如下:string bcmul ( string $left_operand , string $right_operand [, int $scale ] )

例子:

?php echo bcmul(‘1.34747474747′, ’35’, 3); // 47.161 echo bcmul(‘2’, ‘4’); // 8 ?

此函數在php.ini中的選項:

複製代碼 代碼如下:

[bcmath]

; Number of decimal digits for all bcmath functions.

;

bcmath.scale = 0

二、syntax error, unexpected T_STRING, expecting……

嚴重語法錯誤,例如syntax error, unexpected T_STRING, expecting ‘,’ or ‘;’ in F:\phpnow\htdocs\index.php on line 4

後邊標着行號,自己去檢查那一行的標點就行

如果是 第三行 echo 1 後邊沒加;,報錯會報 on line 4 ,on line 4,就是第四行

實例講解:

其實,這是一個非常容易解決掉的問題。在我看來,似曾相識,呵呵,最近學JavaScript可是學會了使用var聲明變量。

其實,在PHP中根本不需要使用var聲明的,但是當一個變量作為一個類的成員變量的時候,使用var還是沒有問題的。

在外部使用var就報錯Parse error: syntax error, unexpected T_VAR in…,例如我的出錯信息:

Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\htdocs\shirdrn\page\p2\pageUtil.inc on line 34

我在測試:在一個類的內部,使用一個自己定義的類對象作為這個類的成員時,出錯了。

Address類對應的address.inc代碼:

?php class Address { var $road; function Address(){} function setRoad($road){ $this-road = $road; } } ?

Person類及其測試代碼為person.php如下:

?php require(“address.inc”); class Person { var $name; var $address; function Person(){ } function display(){ echo “Name : “.$this-name.”BR”; echo “Road : “.$this-address-road.”BR”; } } var $p = new Person(); $p-address = new Address(); $p-address-setRoad(“Chagnchun Road”); $p-name = “Shirdrn”; $p-display(); ?

測試輸出現異常:

Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\htdocs\shirdrn\page\p2\pageUtil.inc on line 34

就是因為在person.php代碼中使用var聲明變量,PHP中是不能這樣的,只要使用“$”符號起始就表示這個字符後面的是一個PHP變量。

呵呵:-)

其它網友的補充方法:

問題解決:syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or 前兩天開始自己php之旅,做一個很普通的網站,結果我們的php是5.0版本,服務器是4.0版本,納悶死咯。 昨天忙了一天,今天早上一來,在一篇文章發現了,解決方法。Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ ,如果有“public”,就將“public”去掉。就不會出錯,如果“public” 是定義變量的話,將“public” 改為“var”。

三、Parse error: syntax error, unexpected T_VARIABLE in XXX.php on line XXX

這條語句是PHP常見的報錯,一般是在XXX行的上一行,或者是XXX行,缺少分號。或者在雙引號中使用雙引號,且沒有轉義等等。

解決方法:找到XXX.php的XXX行,按照上面的分析,找到自己的錯誤,改正即可。

貼士:作為編程人員,要做到代碼嚴謹,思維清晰,並且細心。人非聖賢孰能無過,但盡量避免這些因為粗心出現的錯誤,這樣才能成為合格的程序員。

四、Parse error: syntax error, unexpected ‘X’ in XXX.php on line XXX

這條語句依然是PHP常見的報錯,報錯原因是在XXX.php的XXX行,出現了PHP無法識別的字符。常常是因為function,if等需要‘{‘、‘}’的地方沒有閉合,或者在編程的時候,不小心在‘;’的後面誤打了幾個字符。

解決方法:找到XXX.php的XXX行,刪除多出的字符,添加缺少的字符即可。

五、syntax error, unexpected $end

邏輯忘了閉合 這個報錯還有個特徵,他會提示你最後一行代碼報錯,譬如你一共30行,他就告訴你 on line 30,這時候你別檢查第三十行,你要把30行挨個,檢查一遍,看看哪個標籤沒閉合。

一共3000行,他就告訴你 on line 3000,這時候你別檢查這3000行了,如果你程序排版很亂,在3000行里找哪個括號是個很麻煩的事……我教你一招:ctrl+a ctrl+d alt+f4

好了,你現在可以重寫了。

另一種思路:

Parse error: syntax error, unexpected $end in script.php on line xx

調試了一會後發現產生錯誤的行是文件中間某行

//$str .= “?\n”;

想起來了 PHP 解釋器允許的結尾標記那行還可以用單行注釋,即 //$str .= “?\n”; 被解釋成結尾標記前有注釋,注釋的內容是 //$str .= “,而 ? 後面的 \n”; 會被解釋作 PHP 塊外的內容按 HTML 輸出出去!結果是給 $str .= “?\n”; 這行添加 // 成注釋後,反而多了個 ? 的結束標記,造成原來真正的結束標記成了意料之外的(unexpected)了。

解決辦法就是直接刪掉這一行即可。

PHP 開始和結束標記所在行別寫其它東西,是個好習慣。

六、Notice:Undefined varialbe:……

這是一個比較常見的錯誤,解決方法:error_reporting調整錯誤級別,

以上就是為大家分享的PHP常見的6個錯誤提示,給大家提供了大概的解決思路和方向,希望對大家的學習有所幫助。

PHP自定義門面以後顯示錯誤?

如果您是PHP老手,當然知道當PHP腳本出錯時發生了什麼事情。此時PHP解析器將在屏幕上給出錯誤信息,如 Fatal error: Call to undefined function on line 19 –,因此程序在此處終止。這個信息會嚇到客戶,他可能立即打電話和你進行諮詢。

幸運的是,這裡有解決辦法。PHP擁有內置工具,可以讓開發人員捕捉腳本錯誤然後將它們轉到自定義的錯誤處理器。此時則可以對處理器進行編程顯示更多關於錯誤的詳細信息。還可以將錯誤寫入文件或數據庫以採取補救措施。有時候還可以對處理器編寫程序忽略錯誤消息。

本文中,我將闡述如何使用PHP的錯誤處理API構建用戶自定義的錯誤處理器,並且說明如何以簡單而友好的方式顯示和管理腳本的錯誤信息。

錯誤類型和報告級別

我們從最基本的開始。PHP有三種最基本的錯誤類型,從低級到高級分別為:注意、警告和錯誤(或致命錯誤)。通常情況下,注意和警告不會終止程序;但是致命錯誤則是危險故障(例如,調用一個沒有定義的函數或參考一個不存在的對象),將導致程序中斷。這些錯誤有可能在啟動、解析、編譯或運行時發生。

關鍵字如E_NOTICE, E_ERROR等用於表明錯誤的不同類型和等級。在PHP手冊上可以獲得它們的詳細信息列表。

腳本階段錯誤顯示由error_reporting()函數進行控制。這一函數針對不同的錯誤等級設置不同的參數。表A給出了使用此函數報告警告和致命錯誤的腳本程序。

表A

?php

// display warnings and errors

error_reporting(E_WARNING | E_ERROR);

// this will generate a notice, which will never be displayed

echo $undefinedVar;

// this will generate a fatal error, which will be displayed

callUndefFunc();

?

將表B中的代碼與上面的進行比較發現,Listing B中隱藏錯誤信息甚至隱藏致命信息,使得錯誤信息不會被顯示出來。

表B

?php

// turn off error display

// no errors will be displayed

error_reporting(0);

// this will generate a notice

echo $undefinedVar;

// this will generate a fatal error

callUndefFunc();

?

表C中的代碼將所有錯誤信息甚至簡單的注意事項都顯示出來:

表C

?php

// all errors will be displayed

error_reporting(E_ALL);

// this will generate a notice

echo $undefinedVar;

// this will generate a fatal error

callUndefFunc();

?

如以上3個例子所示,error_reporting()函數在控制錯誤發生時,在屏幕上顯示內容非常重要。這裡的關鍵字是displayed,其表達的意思是錯誤不被顯示而不是錯誤沒有發生。因此,發生致命錯誤時(例如不正確的函數調用),程序將被終止;但是,此時沒有任何消息顯示給用戶。

下面的例子(表 D)說明了這種情況:

表D

?php

// no errors will be displayed

error_reporting(0);

// start a task

echo “Starting task…”;

// call an undefined function

// a fatal error occurs during task processing

callMe();

// end the task

echo “Successfully completed task…”;

?

在表D中,在調用echo()函數時發生了致命錯誤,程序執行時到這點被終止,但是卻沒有任何錯誤消息給出,用戶不知道這種情況還以為程序在正確運行。下面的結論是非常明顯的:不給出錯誤報告非常危險,因為不論過程是否完成它常導致不正確的結論。

注意:調用不帶任何參數的error_reporting()將返回當前的錯誤報告等級。

自定義錯誤處理器

很明顯,隱藏錯誤報告是不正確的,你肯定想知道有什麼其他辦法加以改進。自定義錯誤處理器就是一個很好的能取代PHP默認錯誤處理系統的解決方法。自定義錯誤處理器可以以任何方式設置處理錯誤信息,包括信息如何顯示。

PHP函數中,完成這一功能的是set_error_handler()函數。錯誤發生時,此函數被自動調用,然後給出4個參數:錯誤代碼、錯誤消息、發生錯誤的腳本名稱和錯誤出現的行,此函數對錯誤管理負責。

表E給出一個簡單例子:

表E

?php

// define custom handler

set_error_handler(‘myHandler’);

// custom handler code

function myHandler($code, $msg, $file, $line) {

echo “Just so you know, something went wrong at line $line of your script $file. The system says that the error code was $code, and the reason for the error was: $msg. Sorry about this!”;

}

// generate a notice

echo $undefVar;

?

當運行此腳本的時候,會出現下面的信息:

Just so you know, something went wrong at line 11 of your /dev/error1.php. The system says that the error code was 8, and the reason for the error was: Undefined variable: undefVar. Sorry about this!

此時,PHP的默認錯誤處理器被用戶定義的myHandler()函數所取代,$undefVar變量被激活,PHP通知未定義變量的信息,此信息在運行時引擎產生,然後傳遞給myHandler()函數,同時錯誤發生的地址也傳遞給此函數。然後myHandler()函數輸出友好信息解釋錯誤。

注意:錯誤和致命錯誤很重要,它們會繞過自定義錯誤處理器,然後以PHP默認的錯誤處理機制進行顯示。顯示這些信息可使用前面討論的標準error_reporting()函數進行控制。

例1:動態錯誤頁面和e-mail警報

表F給出了另一個範例,當發生錯誤時,將動態產生HTML錯誤頁面,並且通過e-mail向Web管理員進行報告。

表F

?php

// define custom handler

set_error_handler(‘myHandler’);

// custom handler code

function myHandler($code, $msg, $file, $line, $context) {

// print error page

echo “htmlhead/headbody”;

echo “h2 align=centerError!/h2”;

echo “font color=red size=+1”;

echo “An error occurred while processing your request. Please visit our a href=;home page/a and try again.”;

echo “/font”;

echo “/body/html”;

// email error to admin

$body = “$msg at $file ($line), timed at ” . date (“d-M-Y h:i:s”, mktime());

$body .= “nn” . print_r($context, TRUE);

mail (“webmaster@domain.dom”, “Web site error”, $body);

// halt execution of script

die();

}

// generate a notice

echo $undefVar;

?

這裡,自定義的錯誤處理器在遇到錯誤時動態產生HTML錯誤頁面。此錯誤信息也能被e-mail信息捕獲,然後通過PHP內置的mail()函數發送給管理員。

這裡出現了myHandler()函數的一個新參數$context。這是myHandler()函數的第五個參數,是可選項。它包含了當前變量狀態的快照。包括對管理員有用的上下文信息,有利於減少調試時間。

為什麼是php是世界上最好的語言

部署簡單

很多其他行業的公司,希望有一個網站,他們並沒有多少預算在網站上,可能只是隨便買了一個虛擬主機,這時恐怕最好的選擇就是 PHP 了。支持 Ruby, Python 之類的語言的虛擬主機很少,ASP 需要 Windows 的服務器,只有 PHP 可以運行在任何一家虛擬主機上。

學習門檻低

一開始 PHP 是專為 Web 設計的語言(雖然現在已經在向通用編程語言靠攏了), 學習和使用門檻很低,建一個 .php 文件就是網頁,用 $_GET[‘XXOO’] 就可以獲取到 GET 參數。而其他通用編程語言,原生並不支持這些與 HTTP 協議相關的功能,這時就需要選擇並學習一款 HTTP 框架才能編寫 Web 應用,例如 Tornado(Python), Ruby on Rails 等。

語法簡單

PHP 一開始是弱類型的(現在只是不那麼弱了而已,還算不上強類型),幾乎不需要考慮類型轉換的事情,甚至在一開始很長的一段時間裡,都沒有支持面向對象。PHP 可以非常簡單地從數據庫中存取數據,而一半的網站也無非是從數據庫中讀寫數據。

因為 PHP 是以 CGI 或 FastCGI 的形式運行的,因此也不必考慮內存管理的問題,反正每次請求後,內存都會被釋放。

PHP 的錯誤處理機制也很簡單——如果出錯就在頁面上打印錯誤信息。想要關閉錯誤提示也同樣簡單。

很多重量級的開源項目

如 WordPress(博客), Typecho(博客), Drupal(CMS), MediaWiki(WIKI), DiscuzX(論壇) 等等,可以說想要不折騰地部署一個網站 PHP 就是最佳選擇。

經過了歷史考驗

PHP 畢竟也算是老牌 Web 編程語言了,能踩的坑已經被前輩踩過了,大量的庫可以重用,要招會 PHP 的開發人員也很容易,而 Node.js, Golang 等等新語言則會遇到技術儲備,人才儲備方面的問題。而 Python, Ruby 也不要高興得太早——雖然你們很早就被發明出來了,但那時候還沒多少人搞 Web 開發。

準確的說是web開發最好的語言

php為什麼是世界上最好的語言

部署簡單

很多其他行業的公司,希望有一個網站,他們並沒有多少預算在網站上,可能只是隨便買了一個虛擬主機,這時恐怕最好的選擇就是 PHP 了。支持 Ruby, Python 之類的語言的虛擬主機很少,ASP 需要 Windows 的服務器,只有 PHP 可以運行在任何一家虛擬主機上。

學習門檻低

一開始 PHP 是專為 Web 設計的語言(雖然現在已經在向通用編程語言靠攏了), 學習和使用門檻很低,建一個 .php 文件就是網頁,用 $_GET[‘XXOO’] 就可以獲取到 GET 參數。而其他通用編程語言,原生並不支持這些與 HTTP 協議相關的功能,這時就需要選擇並學習一款 HTTP 框架才能編寫 Web 應用,例如 Tornado(Python), Ruby on Rails 等。

語法簡單

PHP 一開始是弱類型的(現在只是不那麼弱了而已,還算不上強類型),幾乎不需要考慮類型轉換的事情,甚至在一開始很長的一段時間裡,都沒有支持面向對象。PHP 可以非常簡單地從數據庫中存取數據,而一半的網站也無非是從數據庫中讀寫數據。

因為 PHP 是以 CGI 或 FastCGI 的形式運行的,因此也不必考慮內存管理的問題,反正每次請求後,內存都會被釋放。

PHP 的錯誤處理機制也很簡單——如果出錯就在頁面上打印錯誤信息。想要關閉錯誤提示也同樣簡單。

很多重量級的開源項目

如 WordPress(博客), Typecho(博客), Drupal(CMS), MediaWiki(WIKI), DiscuzX(論壇) 等等,可以說想要不折騰地部署一個網站 PHP 就是最佳選擇。

經過了歷史考驗

PHP 畢竟也算是老牌 Web 編程語言了,能踩的坑已經被前輩踩過了,大量的庫可以重用,要招會 PHP 的開發人員也很容易,而 Node.js, Golang 等等新語言則會遇到技術儲備,人才儲備方面的問題。而 Python, Ruby 也不要高興得太早——雖然你們很早就被發明出來了,但那時候還沒多少人搞 Web 開發。

準確的說是web開發最好的語言

PHP中出現錯誤位置怎麼處理?

對於初學者,肯定會遇到不同的錯誤提示,比如:警告,致命,等等,其中NOTICE錯誤等級最低,頁面中,好多類似 Notice: Use of undefined constant title – assumed ‘title’ in D:\wamp\www\phpmysqlweb\bbs\list.php on line 17 。雖然不影響正常運行,但是看着很不舒服,對於那些不懂編程的使用者來說,可能心裡會很害怕,那麼怎麼解決呢?究其原因,是因為變量沒有定義,下面看看我在編程中經常用到的解決方法吧!

1:在上面初始化

2:打開php.ini文件

修改配置文件

error_reporting設置:

找到 error_reporting=E_ALL

修改為 error_reporting=E_ALL ~E_NOTICE

3:把 error_reporting(E_ALL ~E_NOTICE);寫到頭部

4:直接在文件最上面加個error_reporting(0);

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助。

根據具體問題類型,進行步驟拆解/原因原理分析/內容拓展等。

具體步驟如下:/導致這種情況的原因主要是……

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/158467.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 00:41
下一篇 2024-11-19 00:41

相關推薦

發表回復

登錄後才能評論