常數包含數字字母字元和底線,數字允許作為常數名稱。 常量名的所有字母都必須大寫。類別常數必須透過 const 定義為類別的成員,強烈不鼓勵使用 define 定義的全域常數
為什麼要謹慎使用PHP中的常數?
Zend Framework文件中寫道:常數包含數字字母字元和底線,數字允許作為常數名稱。 常量名的所有字母都必須大寫。類別常數必須透過 "const" 定義為類別的成員,強烈不鼓勵使用 "define" 定義的全域常數。
作為PHP的正式框架,為什麼會有這樣的要求?
讓我們一起分析一下。
1. define容易產生意想不到的錯誤
PHP常數是定義後就不能修改和再次賦值。但是如果再次賦值會怎麼樣?
<?php define('C', 12345); define('C', 123); ?>
這段程式碼會報個notice錯誤。帶來的後果是:在你定義之前,其它人要是定義了同名的常數,你可能真的不知道裡面究竟是什麼值。
2. 如何判斷PHP常數是否被定義?判斷方法易寫錯
<?php define('C', 12345); // 错误方法1,经常犯 if (isset(C)){……} // 错误方法2,经常犯 if (defined(C)){……} // 正确方法 if (defined('C')){……} ?>
3. 執行效率低
<?php define('FORUM_THEME',$forum['theme']); $this->display('/'.FORUM_THEME.'@Public:login'); // 系统会从整个执行流程中查找FORUM_THEME ?>
因為php處理常數的時候要進行多次查找,所以效率低。
總結:PHP常數的問題,在於PHP處理常數的方法過於寬鬆導致的,如果能夠嚴格一些,就會避免很多的問題。在實際過程,能用變數就不要用常數,因為變數的效率高使用比較方便。
因此若非要使用常數或類別變量,可使用下列方法:
<?php class foo { const WEBSITE = "www.zhuyinghao.com"; protected $_forum_theme; function name() { echo WEBSITE; $this->_forum_theme = $forum['theme']; } function displace() { echo $this->_forum_theme; } } ?>
類別名稱和函數名稱相同時的作用
在PHP 4中,類別的建構子需要和類別名稱相同,子類別的建構函式名稱與子類別名稱相同,在子類別裡父類別的建構子不會自動執行。要在子類別裡執行父類別的建構函數,必須執行類似以下語句:
$this->[父類別的建構子名稱()]
在PHP 5.0 以上版本裡,統一使用construct()作為建構函數,但仍相容了4.0 版本的建構函數的定義規則。如果同時定義了4.0的建構子和 construct()函數,則construct() 函數優先。
用PHP EOL來取代/r/n進行換行
寫程式時會常用到換行,用PHP內建常數PHP_EOL來換行。
一個小小的換行,在不同的平台有不同的實作。在unix世界換行就用\n來代替,但是windows為了體現他的不同,就用\r\n,更有意思的是在mac中用\r。因此unix系列用 \n,windows系列用 \r\n,mac用 \r。
因此系統會依照平台系統的不同,轉換成不同的換行。如果要在瀏覽器中換行,就要使用PHP_EOL變數進行換行
以上是php常數使用過程中需要注意的幾個問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!