const沒define好用 php,3分鐘短文|PHP 定義常量,我該用define還是const?這下不迷茫了...

引言

我們今天說一下 PHP 編程中,定義一個常量所使用的兩種方法。有哪些區別,以及哪種是最佳實踐?

a6018e0478dba4f08342e48bffeb2da7.png

問題

有開發者說,我在學習編寫 PHP,可是定義常量的方法很是讓人迷惑。比如有下面這樣的寫法:

define('FOO', 1);const FOO = 1;

而且在框架中,也大量地摻雜著兩種定義方法的混用。到底哪一個好?

深層原因

對于 PHP5.3 及以上,定義一個常量有兩種方法,一個是用 const 關鍵字,一個是使用 define 函數。比如這樣寫:

const FOO = 'BAR';define('FOO', 'BAR');

這兩種方式之間的根本區別是const在編譯時定義常量,而define在運行時定義常量。這導致了大多數const的缺點。下面列舉一些:

1 - const不能用于有條件地定義常量。要定義全局常量,必須在最外層范圍中使用它:

if (...) { const FOO = 'BAR'; // 無效}// 但是if (...) { define('FOO', 'BAR'); // 有效}

一種常見的應用是檢查常量是否已經定義:

if (!defined('FOO')) {define('FOO', 'BAR');}

2 - const只能接受一個靜態標量(數字,字符串或其它常量值true,false,null,__FILE__),而define()可使用任何表達式。

const BIT_5 = 1 << 5; // VPHP 5.6 以下版本均無效define('BIT_5', 1 << 5); // 有效

3 - const只能采用簡單的常量名稱,而define()接受任何表達式作為名稱。這樣可以執行以下操作:

for ($i = 0; $i < 32; ++$i) { define('BIT_' . $i, 1 << $i);}

4 - consts始終區分大小寫,而define()允許您通過將其true作為第三個參數傳遞來定義不區分大小寫的常量。

define('FOO', 'BAR', true);echo FOO; // BARecho foo; // BAR

const 的優點

除了上一節所說的 const 的缺點外,我一般都會堅持使用 const。因為它實在太好用,太可愛了。

1 - const使代碼更好讀。

它是一種語言構造,而不是函數,并且與您在類中定義常量的方式保持一致。

2 - const作為一種語言構造,可以通過自動化工具進行靜態分析。

3 - const在當前名稱空間中定義一個常量,同時define()必須傳遞完整的名稱空間名稱:

namespace A\B\C;// 定義常量 A\B\C\FOO:const FOO = 'BAR';define('A\B\C\FOO', 'BAR');

4 - 由于PHP 5.6const常量也可以是數組,而define()尚不支持數組。但是,PHP 7中的兩種情況都支持數組。

const FOO = [1, 2, 3]; // PHP 5.6 及以上有效define('FOO', [1, 2, 3]); // PHP 7.0 及以上有效

5 - const還可以在類或接口內使用它來定義類常量或接口常量。define沒這功能。

class Foo {const BAR = 2; // 完全支持}// 但是class Baz {define('QUX', 2); // 不能這么寫}

寫在最后

除非特別需要,我一般不使用 define 定義常量,可讀性不強。

加上框架中強制的 OOP 方式,使得我們自覺不自覺地形成 const 定義類常量的習慣。而且對于 IDE 的自動索引也極為友好,寫代碼順溜的不得了。

Happy coding :_)

我是 @程序員小助手 ,持續分享編程知識,歡迎關注。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270454.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270454.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot+mybatis集成自定義緩存ehcache用法筆記

今天小編給大家整理了springbootmybatis集成自定義緩存ehcache用法筆記&#xff0c;希望對大家能有所辦幫助&#xff01;一、ehcache介紹EhCache 是一個純Java的進程內緩存管理框架&#xff0c;屬于開源的Java分布式緩存框架&#xff0c;主要用于通用緩存,Java EE和輕量級容器。…

Java取絕對值

在Java中可以使用Math.abs()方法來方便的進行絕對值計算&#xff0c;例如&#xff1a; 輸入的是正數的時候直接返回即可&#xff0c;當是負數的時候返回它的相反數即可。 使用三目運算符可以使用一行代碼就能做到 int value Math.abs(-90);System.out.println(value);System…

PHP怎么做一個加法口訣,神奇的手指速算口訣,100以內的加減法一分鐘學會

手指速算是一套手、心、腦并用的科學計算方法&#xff0c;教孩子學會&#xff0c;既能開發大腦、增強動作協調能力和記憶力&#xff0c;還能增強學習興趣哦~學起來并不難哦&#xff0c;爸爸媽媽可以和孩子一起算一算&#xff0c;比比看誰更快&#xff01;手指速算秘訣準備&…

Android_Layout (一)

layout &#xff08;布局&#xff09; --->Android 有五大布局&#xff0c;分別是&#xff1a; LinearLayout : 線性布局&#xff0c;子組件按照垂直或者水平方向來布局。RelativeLayout &#xff1a;相對布局&#xff0c;按照控件之間的相互位置進行參照物的概念排布&…

前端:uniapp封裝網絡請求筆記

uniapp作為開發移動端的前端框架&#xff0c;目前國內是非常流行的&#xff0c;使用HbuilderX開發工具基于uniapp框架開發的系統可以方便的轉換為小程序、APP等移動端程序&#xff0c;大大降低了移動開發的成本。網絡請求更是每個前端項目必備的技術&#xff0c;所以有必要進行…

java中instanceof使用詳細介紹

instanceof是Java語言中的一個二元運算符&#xff0c;它的作用是&#xff1a;判斷一個引用類型變量所指向的對象是否是一個類(或接口、抽象類、父類)的實例&#xff0c;即它左邊的對象是否是它右邊的類的實例&#xff0c;該運算符返回boolean類型的數據。 boolean result obj…

javaWEB總結(9):自定義HttpServlet

前言:我們知道 MyHttpServlet是MyGenericServlet的子類&#xff0c;MyHttpServlet會繼承父類的方法&#xff0c;可是卻很少去追問MyHttpServlet中的doGet方法和doPost方法是如何進行判斷的&#xff0c;本文主要做一個小例子&#xff0c;進一步理解HttpServlet。有些代碼前文多次…

硬件知識:u-boot和bootloader的區別

目錄 1、Bootloader 2、uboot 2.1.硬件管理 2.2.能夠完成鏡像燒錄&#xff08;刷機&#xff09; 2.3.uboot的“生命周期” 2.4.uboot要提供命令式shell界面 3、bootloader 與 uboot的區別 嵌入式軟件工程師聽說過 u-boot 和 bootloader&#xff0c;但很多工程師依然不知道他們到…

Java中局部變量必須初始化

Java中有兩種變量&#xff0c;局部變量和成員變量。 成員變量可以不進行初始化&#xff0c;虛擬機也會確保它有一個默認的值。 局部變量不能這樣做&#xff0c;我們必須對它進行賦值&#xff0c;才能使用它。

php 直播服務器搭建,基于Nginx搭建RTMP/HLS視頻直播服務器

1、Nginx環境搭建(基于lnmp環境)//下載并安裝lnmp環境wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.sh lnmp安裝完成安裝完成后訪問服務器地址會出現如下界面lnmpPS&#xff1a;安裝時生…

辦公:office辦公軟件Excel表格的打印技巧

很多新手使用辦公軟件過程中&#xff0c;對于Excel的打印出現了諸多問題&#xff0c;今天我們就一起來看看表格打印的幾個技巧&#xff01; 打印預覽時網格線怎么不見了&#xff1f; 如何調整打印區域的頁邊距&#xff1f; 如何設置單色打印&#xff1f; ...... 這些打印時遇到…

vuejs 中如何優雅的獲取 Input 值

http://www.sunzhongwei.com/how-to-get-input-value-in-vuejs轉載于:https://www.cnblogs.com/benpaodexiaopangzi/p/6093275.html

線程池和線程詳細教程

1. 線程池的概念&#xff1a; 線程池就是首先創建一些線程&#xff0c;它們的集合稱為線程池。使用線程池可以很好地提高性能&#xff0c;線程池在系統啟動時即創建大量空閑的線程&#xff0c;程序將一個任務傳給線程池&#xff0c;線程池就會啟動一條線程來執行這個任務&#…

虛擬主機 php .htacess,LiteSpeed添加虛擬主機+支持htaccess圖文教程

上次給大家簡單介紹了Debian下手動安裝LiteSpeedMySQLPHP的教程(點擊查看)&#xff0c;但是這個教程還沒完&#xff0c;想要使用litespeed還要進入后臺進行設置&#xff0c;包括添加虛擬主機和.htaccess偽靜態的支持&#xff0c;本文就繼續這個話題給大家詳細做個圖文教程吧~為…

前端:uniapp封裝組件用法筆記

大家在做前端項目開發的時候&#xff0c;經常會遇到公用的一些頁面&#xff0c;比如搜索、列表、商品詳情卡片、評論列表等。為了提高開發效率、使代碼看起來更加簡潔&#xff0c;這個時候封裝相應的組件是最好的解決方案。今天小編給大家介紹一下如何在uniapp中封裝組件&#…

Angular的工作原理

首先上一小段代碼&#xff08;index.html&#xff09;&#xff0c;結合代碼我們來看看&#xff0c;angular一步一步都做了些什么。 <!doctype html> <html ng-app><head><script src"angular.js"></script></head><body>&…

php中等腰金字塔挖空,php 用for循環做,金字塔,菱形,空三角

echo "金字塔 style1";for($i1;$i<9;$i){for($k0;$kecho "*";}echo "";}echo "金字塔 style2";for($c5;$c>0;$c--){for($c10;$c1echo "*";}echo "";}echo "金字塔 style3";for($a0;$a<11;$a){…

網絡知識:四個網絡命令ping、arp、tracert、route的用法介紹

網絡相關的從業人員&#xff0c;都需要面對檢測和解決網絡故障的各種問題&#xff0c;實際案例中因為網絡導致的故障也是最多的&#xff0c;今天我們和大家一起來學習一下解決網絡故障時使用最多的四個網絡命令。希望對大家以后的實際工作中的故障排除起到作用。 1、Ping命令的…

jQuery擲骰子

網上找的jQuery擲骰子效果&#xff0c;測試兼容IE7及以上瀏覽器&#xff0c;IE6沒有測試 js代碼如下&#xff1a; 1 $(function(){2 var dice $("#dice");3 dice.click(function(){4 $(".wrap").append("<div iddice_mask><…