首頁  >  文章  >  後端開發  >  致命錯誤:無法重新聲明

致命錯誤:無法重新聲明

WBOY
WBOY原創
2016-08-18 09:16:162848瀏覽

在php互動環境中,如果已經有這樣的定義:

<code>function a(){
     return 'a';
}
</code>

現在我發現原來的寫錯了,需要改動

<code> function a(){
     return 'b';
 }
</code>

這時候會報錯, Fatal error: Cannot redeclare

如果你定義

<code>$b=1;</code>

再修改一次

<code>$b=2;</code>

php絕對不會報錯說,b已經被定義了,不可以再redeclare
請問,把函數設計成不可以redeclare,道理何在?
我看了各位的答复,這個問題其實是很普遍的,它會帶來調試上的麻煩,我不知道各位如何在真實的專案環境中是如何解決的。

清讓我們考慮專案場景,你寫了一個函數來完成一項功能,一般不會一次就把這個函數寫完美了,你需要測試吧。
我們導入它,require('myfun.php'),使用了後,發現要修改,你的打開myfun.php,進行修改,保存修改後,你的關閉上次的php -a環境,重新php - a ,然後再導入require('myfun.php')。
如果不關閉(或說退出)php -a環境,再次匯入修改後的myfun.php,會立即報錯:Fatal error: Cannot redeclare。

php語言的這個特性導致調試麻煩,各位有無快速的方法?

回覆內容:

在php互動環境中,如果已經有這樣的定義:

<code>function a(){
     return 'a';
}
</code>

現在我發現原來的寫錯了,需要改動

<code> function a(){
     return 'b';
 }
</code>

這時候會報錯, Fatal error: Cannot redeclare

如果你定義

<code>$b=1;</code>

再修改一次

<code>$b=2;</code>

php絕對不會報錯說,b已經被定義了,不可以再redeclare
請問,把函數設計成不可以redeclare,道理何在?
我看了各位的答复,這個問題其實是很普遍的,它會帶來調試上的麻煩,我不知道各位如何在真實的專案環境中是如何解決的。

清讓我們考慮專案場景,你寫了一個函數來完成一項功能,一般不會一次就把這個函數寫完美了,你需要測試吧。
我們導入它,require('myfun.php'),使用了後,發現要修改,你的打開myfun.php,進行修改,保存修改後,你的關閉上次的php -a環境,重新php - a ,然後再導入require('myfun.php')。
如果不關閉(或說退出)php -a環境,再次匯入修改後的myfun.php,會立即報錯:Fatal error: Cannot redeclare。

php語言的這個特性導致調試麻煩,各位有無快速的方法?

能不能改下格式先?

對於弱型別語言來說,PHP函數重載,並不像一般的OOP。
因為函數重載必須滿足兩個條件:
1、函數參數的個數不一樣。
2、參數的型別不一樣。
這兩點,PHP都沒有辦法滿足,您可以對函數多加入參數,只是相當於多傳了個臨時變數。而弱類型本來就不區分,所以無法透過這些來實現。

http://blog.csdn.net/smartyid...

函數不能重複定義 -- 這點確實和js不一樣。 js裡面的函數其實就是變數,所以可以重新賦值。但是在php中,函數並不是相當於變量,而是一個符號或一個常數。大概因為重複定義會容易造成誤解所以不讓重複定義。

...這是過程式的程式碼 沒有重載概念吧。 。
第一個方法加上
if ( ! function_exists('a')) {

<code>function a(){
     return 'a';
}</code>

}
然後把第二個方法的引入寫在第一個之前,似乎只能這樣

謝邀。
我沒有更方便的方法,主要是很少人用互動方式測試吧?退出php -a環境重新進又不麻煩...
很簡單的測試模擬運行一下就行了,例如你可以用 https://glot.io/

這個真的不需要糾結,而且也不用去從這個層面去糾結語言是否給重載函數

你是特別喜歡php -a這個shell環境還是什麼?

這種問題解決方案其實很多,最簡單的例如你覺得這個環境調試不方便,那就編輯一個x.php文件,然後php x.php就一次把你修改的程式碼結果輸出了,也就起到了調試作用。

如果真的想用高級一點的debug方法還可以試試xdebug

首先,絕大部分的語言都不支援的方法重定義,PHP自然也不例外。

其次,你的調試方法真的很奇怪,第一次見人用php -a來調試的,PHP有各種調試工具,也不差單元測試,你使用的php -a都不能算是調試。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn