<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'language.operators.comparison.php',
    1 => '比较',
    2 => '比较运算符',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => '运算符',
  ),
  'prev' => 
  array (
    0 => 'language.operators.bitwise.php',
    1 => '位',
  ),
  'next' => 
  array (
    0 => 'language.operators.errorcontrol.php',
    1 => '错误控制',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'language/operators/comparison.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.comparison" class="sect1">
 <h2 class="title">比较运算符</h2>
 
 <p class="simpara">
  比较运算符，如同它们名称所暗示的，允许对两个值进行比较。还可以参考
  <a href="types.comparisons.php" class="link">PHP 类型比较表</a>看不同类型相互比较的例子。
 </p>
 <table class="doctable table">
  <caption><strong>比较运算符</strong></caption>
  
   <thead>
    <tr>
     <th>例子</th>
     <th>名称</th>
     <th>结果</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td>$a == $b</td>
     <td>等于</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果类型转换后 <var class="varname">$a</var> 等于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a === $b</td>
     <td>全等</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果 <var class="varname">$a</var> 等于 <var class="varname">$b</var>，并且它们的类型也相同。</td>
    </tr>

    <tr>
     <td>$a != $b</td>
     <td>不等</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果类型转换后 <var class="varname">$a</var> 不等于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a &lt;&gt; $b</td>
     <td>不等</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果类型转换后 <var class="varname">$a</var> 不等于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a !== $b</td>
     <td>不全等</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果 <var class="varname">$a</var> 不等于 <var class="varname">$b</var>，或者它们的类型不同。</td>
    </tr>

    <tr>
     <td>$a &lt; $b</td>
     <td>小于</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果 <var class="varname">$a</var> 严格小于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a &gt; $b</td>
     <td>大于</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果 <var class="varname">$a</var> 严格大于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a &lt;= $b</td>
     <td>小于等于</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果 <var class="varname">$a</var> 小于或者等于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a &gt;= $b</td>
     <td>大于等于</td>
     <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>，如果 <var class="varname">$a</var> 大于或者等于 <var class="varname">$b</var>。</td>
    </tr>

    <tr>
     <td>$a &lt;=&gt; $b</td>
     <td>太空船运算符（组合比较符）</td>
     <td>
      当<var class="varname">$a</var>小于、等于、大于 <var class="varname">$b</var>时
      分别返回一个小于、等于、大于0的 <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 值。
     </td>
    </tr>

   </tbody>
  
 </table>

 <p class="para">
  当两个操作对象都是
  <a href="language.types.numeric-strings.php" class="link">数字字符串</a>，
  或一个是数字另一个是
  <a href="language.types.numeric-strings.php" class="link">数字字符串</a>，
  就会自动按照数值进行比较。
  此规则也适用于
  <a href="control-structures.switch.php" class="link">switch</a> 语句。
  当比较时用的是 <code class="literal">===</code> 或 <code class="literal">!==</code>，
  则不会进行类型转换——因为不仅要对比数值，还要对比类型。
 </p>
 <div class="warning"><strong class="warning">警告</strong>
 <p class="para">
 PHP 8.0.0 之前，如果 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 与数字或者数字字符串进行比较，
 则在比较前会将 <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 转化为数字。
 在如下示例中会出现不可预料的结果：
  <div class="informalexample">
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0 </span><span style="color: #007700">== </span><span style="color: #DD0000">"a"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"1" </span><span style="color: #007700">== </span><span style="color: #DD0000">"01"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"10" </span><span style="color: #007700">== </span><span style="color: #DD0000">"1e1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">100 </span><span style="color: #007700">== </span><span style="color: #DD0000">"1e2"</span><span style="color: #007700">);<br /><br />switch (</span><span style="color: #DD0000">"a"</span><span style="color: #007700">) {<br />case </span><span style="color: #0000BB">0</span><span style="color: #007700">:<br />    echo </span><span style="color: #DD0000">"0"</span><span style="color: #007700">;<br />    break;<br />case </span><span style="color: #DD0000">"a"</span><span style="color: #007700">:<br />    echo </span><span style="color: #DD0000">"a"</span><span style="color: #007700">;<br />    break;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <p class="para">以上示例在 PHP 7 中的输出：</p>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bool(true)
bool(true)
bool(true)
bool(true)
0
</pre></div>
    </div>
    <p class="para">以上示例在 PHP 8 中的输出：</p>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bool(false)
bool(true)
bool(true)
bool(true)
a
</pre></div>
    </div>
   </div>
  </p>
 </div>

 <p class="para">
  <div class="example" id="example-1">
   <p><strong>示例 #1 比较运算符</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 整数<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// 浮点数<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2.5</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// 字符串<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"b" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"aa"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">;  </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"zz" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"aa"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// 数组<br /></span><span style="color: #007700">echo [] &lt;=&gt; [], </span><span style="color: #DD0000">' '</span><span style="color: #007700">;               </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">], </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [], </span><span style="color: #DD0000">' '</span><span style="color: #007700">;        </span><span style="color: #FF8000">// 1<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">], </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">], </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /><br />// 对象<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"c"</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"c"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br />// 不仅仅比较值，而且也会匹配 key<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"b" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <p class="para">
  对于多种类型，比较运算符根据下表比较（按顺序）。
 </p>
 <table id="language.operators.comparison.types" class="doctable table">
  <caption><strong>比较多种类型</strong></caption>
  
   <thead>
    <tr>
     <th>运算数 1 类型</th>
     <th>运算数 2 类型</th>
     <th>结果</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td><span class="type"><a href="language.types.null.php" class="type null">null</a></span> 或 <span class="type"><a href="language.types.string.php" class="type string">string</a></span></td>
     <td><span class="type"><a href="language.types.string.php" class="type string">string</a></span></td>
     <td>将 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> 转换为 &quot;&quot;，进行数字或词汇比较</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> 或 <span class="type"><a href="language.types.null.php" class="type null">null</a></span></td>
     <td>任何其它类型</td>
     <td>转换为 <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>，<strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> &lt; <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span></td>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span></td>
     <td>
      内置类可以定义自己的比较，不同类不能比较，相同的类查看<a href="language.oop5.object-comparison.php" class="link">对象比较</a>
     </td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.string.php" class="type string">string</a></span>、<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>、<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>、<span class="type"><a href="language.types.float.php" class="type float">float</a></span></td>
     <td><span class="type"><a href="language.types.string.php" class="type string">string</a></span>、<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>、<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>、<span class="type"><a href="language.types.float.php" class="type float">float</a></span></td>
     <td>将字符串和资源转换成数字，按普通数学比较</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span></td>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span></td>
     <td>
      成员越少的数组越小，如果运算数 1 中的键不存在于运算数
      2 中则数组无法比较，否则挨个值比较（见下例）
     </td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span></td>
     <td>任何其它类型</td>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span> 总是更大</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span></td>
     <td>任何其它类型</td>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span> 总是更大</td>
    </tr>

   </tbody>
  
 </table>


 <p class="para">
  <div class="example" id="example-2">
   <p><strong>示例 #2 Boolean/null comparison</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Bool 和 null 总是作为 bool 比较<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">1 </span><span style="color: #007700">== </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">);  </span><span style="color: #FF8000">// TRUE——等同于 (bool) 1 == TRUE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0 </span><span style="color: #007700">== </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">); </span><span style="color: #FF8000">// TRUE——等同于 (bool) 0 == FALSE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">100 </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">); </span><span style="color: #FF8000">// FALSE——等同于 (bool) 100 &lt; TRUE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(-</span><span style="color: #0000BB">10 </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">);</span><span style="color: #FF8000">// FALSE——等同于 (bool) -10 &lt; FALSE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">min</span><span style="color: #007700">(-</span><span style="color: #0000BB">100</span><span style="color: #007700">, -</span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #0000BB">100</span><span style="color: #007700">)); </span><span style="color: #FF8000">// NULL——(bool) NULL &lt; (bool) -100 即 FALSE &lt; TRUE<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <p class="para">
  <div class="example" id="example-3">
   <p><strong>示例 #3 标准数组比较代码</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 数组是用标准比较运算符或者太空船运算符进行比较的<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">standard_array_compare</span><span style="color: #007700">(</span><span style="color: #0000BB">$op1</span><span style="color: #007700">, </span><span style="color: #0000BB">$op2</span><span style="color: #007700">)<br />{<br />    if (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op1</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op2</span><span style="color: #007700">)) {<br />        return -</span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// $op1 &lt; $op2<br />    </span><span style="color: #007700">} elseif (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op1</span><span style="color: #007700">) &gt; </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op2</span><span style="color: #007700">)) {<br />        return </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// $op1 &gt; $op2<br />    </span><span style="color: #007700">}<br />    foreach (</span><span style="color: #0000BB">$op1 </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />        if (!</span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">$op2</span><span style="color: #007700">)) {<br />            return </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />        } elseif (</span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">$op2</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]) {<br />            return -</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />        } elseif (</span><span style="color: #0000BB">$val </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">$op2</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]) {<br />            return </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />        }<br />    }<br />    return </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #FF8000">// $op1 == $op2<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <div class="warning"><strong class="warning">警告</strong>
  <h1 class="title">比较浮点数</h1>

  <p class="para">
   由于浮点数 <span class="type"><a href="language.types.float.php" class="type float">float</a></span> 的内部表达方式，不应比较两个浮点数<span class="type"><a href="language.types.float.php" class="type float">float</a></span>是否相等。
  </p>

  <p class="para">
   更多信息参见 <span class="type"><a href="language.types.float.php" class="type float">float</a></span>。
  </p>
 </div>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <span class="simpara">
   请注意，在比较不同类型的值时，类型转换并不总是很明显，尤其是比较 <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 与 <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> 或者
   <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 与 <span class="type"><a href="language.types.string.php" class="type string">string</a></span>。因此，在大多数情况下，通常建议使用 <code class="literal">===</code> 和
   <code class="literal">!==</code> 进行比较而不是 <code class="literal">==</code> 和 <code class="literal">!=</code>。
  </span>
 </p></blockquote>

 <div class="sect2" id="language.operators.comparison.incomparable">
  <h3 class="title">不能比较的值</h3>
  <p class="simpara">
   虽然恒等比较（<code class="literal">===</code> 和
   <code class="literal">!==</code>）可以应用于任意值，其它比较运算符应该仅用于可比较的值。不能比较的值的比较的结果是不确定的，不应依赖。
  </p>
 </div>

 <div class="sect2">
  <h3 class="title">参见</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.strcasecmp.php" class="function">strcasecmp()</a></span></li>
    <li><span class="function"><a href="function.strcmp.php" class="function">strcmp()</a></span></li>
    <li><a href="language.operators.array.php" class="link">数组运算符</a></li>
    <li><a href="language.types.php" class="link">类型</a></li>
   </ul>
  </p>
 </div>

<div class="sect2" id="language.operators.comparison.ternary">
  <h3 class="title">三元运算符</h3>
  <p class="para">
   另一个条件运算符是“?:”（或三元）运算符 。
   <div class="example" id="example-4">
    <p><strong>示例 #4 赋默认值</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 三元运算符的例子<br /></span><span style="color: #0000BB">$action </span><span style="color: #007700">= (empty(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">])) ? </span><span style="color: #DD0000">'default' </span><span style="color: #007700">: </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// 以上等同于以下的  if/else 语句<br /></span><span style="color: #007700">if (empty(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #DD0000">'default'</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   表达式 <code class="literal">(expr1) ? (expr2) : (expr3)</code> 在
   <span class="replaceable">expr1</span> 求值为 <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
   时的值为 <span class="replaceable">expr2</span>，在
   <span class="replaceable">expr1</span> 求值为 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> 时的值为
   <span class="replaceable">expr3</span>。
  </p>
  <p class="para">
   可以省略三元运算符中间那部分。表达式
   <code class="literal">expr1 ?: expr3</code> 等同于如果
   <span class="replaceable">expr1</span> 求值为 <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> 时返回
   <span class="replaceable">expr1</span> 的结果，否则返回
   <span class="replaceable">expr3</span>。<span class="replaceable">expr1</span> 在这里仅执行一次。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    注意三元运算符是个语句，因此其求值不是变量，而是语句的结果。如果想通过引用返回一个变量这点就很重要。在一个通过引用返回的函数中语句
    <code class="literal">return $var == 42 ? $a : $b;</code> 将不起作用，以后的 PHP
    版本会为此发出一条警告。
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    建议避免将三元运算符堆积在一起使用。和其他语言相比，
    当在单个表达式中使用多个未加括号的三元运算符时会造成
    PHP 运算结果不清晰。
    甚至在 PHP 8.0.0 之前，三元运算符是从左到右执行的，
    而大多数其他编程语言是从右到左的。
    自 PHP 7.4.0 起，弃用依靠左联。
    PHP 8.0.0 起，三元运算符是非关联的。
    <div class="example" id="example-5">
     <p><strong>示例 #5 不清晰的三元运算符行为</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 乍看起来下面的输出是 'true'<br /></span><span style="color: #007700">echo (</span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #DD0000">'true' </span><span style="color: #007700">: </span><span style="color: #0000BB">false </span><span style="color: #007700">? </span><span style="color: #DD0000">'t' </span><span style="color: #007700">: </span><span style="color: #DD0000">'f'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 然而，上面语句的实际输出是't'，因为在 PHP 8.0.0 之前三元运算符是左联的<br /><br />// 下面是与上面等价的语句，但更清晰<br /></span><span style="color: #007700">echo ((</span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #DD0000">'true' </span><span style="color: #007700">: </span><span style="color: #DD0000">'false'</span><span style="color: #007700">) ? </span><span style="color: #DD0000">'t' </span><span style="color: #007700">: </span><span style="color: #DD0000">'f'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 这里可以看到第一个表达式的计算结果是 “true”，第二个表达式的计算结果为 (bool) true，<br />// 因此返回第二个三元表达式的 true 分支。<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    然而，短三元运算符（<code class="literal">?:</code>）的链接是稳定且合理的。他将第一个参数进行求值，结果为非假值。注意，未定义的值将会引发警告。
    <div class="example" id="example-6">
     <p><strong>示例 #6 Short-ternary chaining</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">1 </span><span style="color: #007700">?: </span><span style="color: #0000BB">2 </span><span style="color: #007700">?: </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">//1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">2 </span><span style="color: #007700">?: </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">//2<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">//3<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
 </div>

 <div class="sect2" id="language.operators.comparison.coalesce">
  <h3 class="title">NULL 合并运算符</h3>
  <p class="para">
   另一个简略运算符是 &quot;??&quot; （NULL 合并）运算符。
   <div class="example" id="example-7">
    <p><strong>示例 #7 设置默认值</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// NULL 合并运算符的例子<br /></span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">] ?? </span><span style="color: #DD0000">'default'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 以上例子等同于于以下 if/else 语句<br /></span><span style="color: #007700">if (isset(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">];<br />} else {<br />    </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #DD0000">'default'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   当 <span class="replaceable">expr1</span> 为  <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>，表达式 <code class="literal">(expr1) ?? (expr2)</code> 等同于
   <span class="replaceable">expr2</span>，否则为 <span class="replaceable">expr1</span>。
  </p>
  <p class="para">
   尤其要注意，当不存在左侧的值时，此运算符也和 <span class="function"><a href="function.isset.php" class="function">isset()</a></span> 一样不会产生警告。
   对于 array 键尤其有用。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    请注意：NULL 合并运算符是一个表达式，产生的也是表达式结果，而不是变量。
    返回引用变量时需要强调这一点。
    因此，在返回引用的函数里就无法使用这样的语句：<code class="literal">return $foo ?? $bar;</code>，还会提示警告。
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    null 合并运算符的优先级较低。这意味着如果将它与其它运算符（比如字符串链接或者算术运算符）混合使用，可能需要括号。
   </p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// $name 未定义，引发警告。<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">'Mr. ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$name </span><span style="color: #007700">?? </span><span style="color: #DD0000">'Anonymous'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 打印 "Mr. Anonymous"<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">'Mr. ' </span><span style="color: #007700">. (</span><span style="color: #0000BB">$name </span><span style="color: #007700">?? </span><span style="color: #DD0000">'Anonymous'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    请注意，NULL 合并运算符支持简单的嵌套：
    <div class="example" id="example-8">
     <p><strong>示例 #8 嵌套 NULL 合并运算符</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$baz </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$qux </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #0000BB">$foo </span><span style="color: #007700">?? </span><span style="color: #0000BB">$bar </span><span style="color: #007700">?? </span><span style="color: #0000BB">$baz </span><span style="color: #007700">?? </span><span style="color: #0000BB">$qux</span><span style="color: #007700">; </span><span style="color: #FF8000">// 输出 1<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
 </div>
</div><?php manual_footer($setup); ?>