ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# define与const(php5.3) 类常量 ``` <pre class="calibre18">``` const 类常量(php5<span class="token3">.</span><span class="token6">3</span>引入) 类内调用常量属性<span class="token3">:</span>self<span class="token3">:</span><span class="token3">:</span>常量名 <span class="token">// 类外获取类中的常量属性类名::常量名;</span> const是常量 值不能修改了 static是<span class="token3">[</span>静态成员<span class="token3">]</span><span class="token3">(</span>https<span class="token3">:</span><span class="token1">/</span><span class="token1">/</span>www<span class="token3">.</span>baidu<span class="token3">.</span>com<span class="token1">/</span>s<span class="token1">?</span>wd<span class="token1">=</span><span class="token1">%</span>E9<span class="token1">%</span><span class="token6">9</span>D<span class="token1">%</span><span class="token6">99</span><span class="token1">%</span>E6<span class="token1">%</span><span class="token6">80</span><span class="token1">%</span><span class="token6">81</span><span class="token1">%</span>E6<span class="token1">%</span><span class="token6">88</span><span class="token1">%</span><span class="token6">90</span><span class="token1">%</span>E5<span class="token1">%</span><span class="token6">91</span><span class="token1">%</span><span class="token6">98</span><span class="token1">&</span>tn<span class="token1">=</span><span class="token6">44039180</span>_cpr<span class="token1">&</span>fenlei<span class="token1">=</span>mv6quAkxTZn0IZRqIHckPjm4nH00T1dBnWRYPHF<span class="token1">-</span>PvFWuWbdrH7h0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy<span class="token1">-</span>bIi4WUvYETgN<span class="token1">-</span>TLwGUv3EnHcdP10srHn1<span class="token3">)</span>可以在不实例化得情况下 在类外直接访问 CONST不行 <span class="token">/* const:定义常量 define('HOST', 'localhost'); */</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'HOST'</span><span class="token3">,</span> <span class="token2">'localhost'</span><span class="token3">)</span><span class="token3">;</span> echo HOST<span class="token3">;</span> <span class="token">// 使用const定义常量 </span> const USER <span class="token1">=</span> <span class="token2">'root'</span><span class="token3">;</span> echo USER<span class="token3">;</span> class <span class="token4">person</span><span class="token3">{</span> const SS<span class="token1">=</span><span class="token2">'aa'</span><span class="token3">;</span> <span class="token">//self::SS; 这行报错:得出self调用自身的常量必需放在方法里 </span> public <span class="token5">function</span> <span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">{</span> echo <span class="token2">'调用自身的常量'</span><span class="token3">.</span>self<span class="token3">:</span><span class="token3">:</span>SS<span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> echo person<span class="token3">:</span><span class="token3">:</span>SS<span class="token3">;</span><span class="token">//输出aa 没有实例化在外部能调用常量 </span> $obj<span class="token1">=</span><span class="token5">new</span> <span class="token4">person</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">demo</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> 类的内部调用常量需要实例化才行 类常量可以被子类继承<span class="token3">,</span>覆盖(修改值) class <span class="token4">Model</span> <span class="token3">{</span> <span class="token">// const可以在类内部定义常量属性 </span> const PASS <span class="token1">=</span> <span class="token2">''</span><span class="token3">;</span> public <span class="token5">function</span> \_\<span class="token4">_construct</span><span class="token3">(</span><span class="token3">)</span> <span class="token3">{</span> <span class="token">// 类内调用常量属性:self::常量名 </span> mysql\<span class="token4">_connect</span><span class="token3">(</span>HOST<span class="token3">,</span>USER<span class="token3">,</span>self<span class="token3">:</span><span class="token3">:</span>PASS<span class="token3">)</span> or <span class="token4">die</span><span class="token3">(</span><span class="token2">'链接失败'</span><span class="token3">)</span><span class="token3">;</span> echo <span class="token2">'链接成功'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> <span class="token">// 实例化Model类 </span> $m <span class="token1">=</span> <span class="token5">new</span> <span class="token4">Model</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 类外获取类中的常量属性 </span> echo Model<span class="token3">:</span><span class="token3">:</span>PASS<span class="token3">;</span> ``` ``` **获取常量值的另一种方法** constant(string`$name`) :mixed 返回类常量的值 当你不知道常量名,却需要获取常量的值时,\*\*constant()\*\*就很有用了。也就是常量名储存在一个变量里,或者由函数返回常量名。 ``` <pre class="calibre10">``` <span class="token4">define</span><span class="token3">(</span><span class="token2">"MAXSIZE"</span><span class="token3">,</span> <span class="token6">100</span><span class="token3">)</span><span class="token3">;</span> echo MAXSIZE<span class="token3">;</span> echo <span class="token4">constant</span><span class="token3">(</span><span class="token2">"MAXSIZE"</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// same thing as the previous line</span> interface <span class="token4">bar</span> <span class="token3">{</span> const test <span class="token1">=</span> <span class="token2">'foobar!'</span><span class="token3">;</span> <span class="token3">}</span> class <span class="token4">foo</span> <span class="token3">{</span> const test <span class="token1">=</span> <span class="token2">'foobar!'</span><span class="token3">;</span> <span class="token3">}</span> <span class="token">//将常量名定义在变量里</span> $const <span class="token1">=</span> <span class="token2">'test'</span><span class="token3">;</span> <span class="token4">var_dump</span><span class="token3">(</span><span class="token4">constant</span><span class="token3">(</span><span class="token2">'bar::'</span><span class="token3">.</span> $const<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// string(7) "foobar!"</span> <span class="token4">var_dump</span><span class="token3">(</span><span class="token4">constant</span><span class="token3">(</span><span class="token2">'foo::'</span><span class="token3">.</span> $const<span class="token3">)</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// string(7) "foobar!"</span> ``` ``` **在php中定义常量时,const和define的区别?** 使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数。根本区别在于const会在代码编译时定义一个常量,而define则是在代码运行时才定义一个常量,因为const在编译时就被执行了,所以它在速度上要比define快得多。尤其是在使用define定义大量常量时,PHP的运行速度会变得非常慢。人们甚至发明了诸如apc\_load\_constantshide来避免这个问题 1、都可以可用于全局常量。 ``` <pre class="calibre10">``` const FOO <span class="token1">=</span> <span class="token2">'BAR'</span><span class="token3">;</span><span class="token">//php5.3+</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'FOO'</span><span class="token3">,</span><span class="token2">'BAR'</span><span class="token3">)</span><span class="token3">;</span> ``` ``` 2、const可在类中使用,一经定义,不可修改define则不能 ``` <pre class="calibre10">``` class <span class="token4">Foo</span> <span class="token3">{</span> const BAR <span class="token1">=</span> <span class="token6">2</span><span class="token3">;</span> <span class="token">// 有效</span> <span class="token3">}</span> class <span class="token4">Baz</span> <span class="token3">{</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'QUX'</span><span class="token3">,</span> <span class="token6">2</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 无效</span> <span class="token3">}</span> ``` ``` 3、不能在函数内,循环内以及条件语句(if,三元,&&,||,switch)之内用*const*来定义常量 ``` <pre class="calibre10">``` <span class="token5">if</span> <span class="token3">(</span><span class="token3">.</span><span class="token3">.</span><span class="token3">.</span><span class="token3">)</span> <span class="token3">{</span> const FOO <span class="token1">=</span> <span class="token2">'BAR'</span><span class="token3">;</span> <span class="token">// 无效的</span> <span class="token3">}</span> <span class="token">//对检测常量是否定义,未定义则定义很用用,const无法做到</span> <span class="token5">if</span> <span class="token3">(</span><span class="token1">!</span><span class="token4">defined</span><span class="token3">(</span><span class="token2">'FOO'</span><span class="token3">)</span><span class="token3">)</span> <span class="token3">{</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'FOO'</span><span class="token3">,</span> <span class="token2">'BAR'</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 有效的</span> <span class="token3">}</span> ``` ``` 4、php5.6之前const不能接受表达式 ``` <pre class="calibre10">``` const BIT_5 <span class="token1">=</span> <span class="token6">1</span> <span class="token1"><</span><span class="token1"><</span> <span class="token6">5</span><span class="token3">;</span> <span class="token">// 在PHP5.6之后有效,之前无效</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'BIT_5'</span><span class="token3">,</span> <span class="token6">1</span> <span class="token1"><</span><span class="token1"><</span> <span class="token6">5</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 一直有效</span> ``` ``` 5、const定义的常量是大小写敏感的,但是define允许你将其第三个参数设置为true来关闭其对大小写的敏感(不推荐): php7.3将废弃大小写不敏感的常量,将 TRUE 作为第三个参数传递给 define() 会导致一个废弃警告 ``` <pre class="calibre10">``` <span class="token4">define</span><span class="token3">(</span><span class="token2">'FOO'</span><span class="token3">,</span> <span class="token2">'BAR'</span><span class="token3">,</span> <span class="token6">true</span><span class="token3">)</span><span class="token3">;</span> <span class="token">//php7.3会抛出警告哦</span> echo FOO<span class="token3">;</span> <span class="token">// BAR</span> echo foo<span class="token3">;</span> <span class="token">// BAR</span> ``` ``` 6、const默认在当前的namespace下定义常量,而使用define则需要你写明整个namespace的完整路径: ``` <pre class="calibre10">``` namespace A\B\C<span class="token3">;</span> <span class="token">// 如果要定义常量 A\B\C\FOO:</span> const FOO <span class="token1">=</span> <span class="token2">'BAR'</span><span class="token3">;</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'A\B\C\FOO'</span><span class="token3">,</span> <span class="token2">'BAR'</span><span class="token3">)</span><span class="token3">;</span> ``` ``` 6、自从PHP5.6后,使用const数组也能被定义为常量。而define目前是不支持这一功能的,但是该功能会在PHP7中被实现: ``` <pre class="calibre10">``` const FOO <span class="token1">=</span> <span class="token3">[</span><span class="token6">1</span><span class="token3">,</span> <span class="token6">2</span><span class="token3">,</span> <span class="token6">3</span><span class="token3">]</span><span class="token3">;</span> <span class="token">// 在PHP 5.6中有效</span> <span class="token4">define</span><span class="token3">(</span><span class="token2">'FOO'</span><span class="token3">,</span> <span class="token3">[</span><span class="token6">1</span><span class="token3">,</span> <span class="token6">2</span><span class="token3">,</span> <span class="token6">3</span><span class="token3">]</span><span class="token3">)</span><span class="token3">;</span> <span class="token">// 在PHP 5.6无效, 在PHP 7.0有效</span> ``` ``` 总结:除非你需要使用表达式或者在条件语句中定义常量,不然的话仅仅是为了代码的简单可读性你都最好要使用const!