ホームページ  >  記事  >  バックエンド開発  >  PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:52:57998ブラウズ

PHPの比較演算と論理演算、PHPの演算ロジック

1. empty()を使用して以下の値が真であると判定されます:

未割り当て変数、未宣言変数、0、"0"、""、false、null、空の配列 array()、オブジェクトのマジックメソッド __get() によって返される値

PHP5.0より前のバージョンでは、属性を持たないオブジェクトもemptyによって空と判定されます

注: empty() は変数、または変数のインデックス値や属性値のみを受け入れます。定数を直接渡すことも、演算式を渡すこともできません。式は PHP 5.5 以降でサポートされます

2. isset() によって false と判断される値: 未割り当ての変数、未宣言の変数、null、__get() によって返される値は empty() と同じ参加を受け入れ、定数や式にすることはできません。

3. さまざまな種類のデータの比較

それらの 1 つがブール型または null の場合、比較のためにブール型に変換します。

それ以外の場合、それらの 1 つが数値である場合、それを数値に変換し、

を比較します それ以外の場合、それらの 1 つが文字列である場合は、それを文字列に変換して比較します

オブジェクト型は常に配列型およびスカラー型より大きく、配列型は常にスカラー型より大きくなります

次の比較結果に注目してください:

リーリー PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

4. 型変換ルール

empty() でtrueと判定された値は

boolean型に変換して false を取得し、それ以外の場合は true となります(__get() で返される値は具体的な値に応じて判定する必要があります) empty()でtrueと判定された値をnumberに変換して0を取得、空でない配列をnumberに変換して1を取得(__get()で返される値は具体的な値に応じて判定する必要がある)

リーリー

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル文字列から数値へのいくつかの変換シナリオ:

リーリー

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

文字列を数値に変換する場合、変換のために左側の数値文字列をインターセプトします。そうでない場合は、0を返します。

他のデータを文字列に変換します:

リーリー リーリー

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル 配列は文字列と直接連結できますが、数学的演算を行うことはできません。PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

オブジェクトタイプをブール値に変換することは常に true です。オブジェクトタイプは数値と文字列に変換できないため、文字列の結合や数学的演算は実行できません

スカラーを配列に変換する方法は、配列の最初の要素をスカラーに設定し、配列を返すことです。 スカラーはオブジェクトに変換され、stdClass クラスのインスタンスが取得され、スカラーの値は scalar という名前の属性に割り当てられます: Object( [scalar] => 234)

配列は stdClass クラスのインスタンスを取得するためにオブジェクトに変換されます。配列のキーはクラスのプロパティ名です。

オブジェクトから配列への変換は少し複雑です:

メソッド、静的プロパティ、クラス定数は破棄されます

保護された属性名の前には「*」が付きます

面 プライベート属性はプレハブとしてプレフィックスとして追加されます (大文字と小文字はクラス名とまったく同じです)

これらの接頭辞の前後にスペース文字を追加します

たとえば、オブジェクトから変換された配列は次のようになります:

リーリー

元のオブジェクトには以下が含まれます:

パブリック属性 a2、保護された属性 v、p、これらの属性がどのクラスに由来するかを識別することは不可能です (オーバーライドされた場合、サブクラスの属性が取得されます)

          来自类 b 的 private 属性 f、k,(从数组 key 来看,以bf为例,无法判断他是属性名为bf,还是来自类b的私有属性f)

          来自类 A 的 private 属性 k 

          无法鉴别 b 和 A 哪个是子类哪个是父类(仅从 array 的key来看,也无法推断出原对象构造自哪个类)

 

例子:

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル
<span>class</span><span> A {
    </span><span>private</span> <span>$A</span> = 'private property, $A of class A'; <span>//</span><span> This will become '\0A\0A'</span>
    <span>protected</span> <span>$C</span> = 'protected property, $C of class A'<span>;
}

</span><span>class</span> B <span>extends</span><span> A {
    </span><span>private</span> <span>$A</span> = 'private property, $A of class B'; <span>//</span><span> This will become '\0B\0A'</span>
    <span>public</span> <span>$AA</span> = 'public property, $AA of class B'; <span>//</span><span> This will become 'AA'</span>
    <span>protected</span> <span>$B</span> = 'protected property, $B of class B'<span>;
}

</span><span>$arr</span> = (<span>array</span>) <span>new</span><span> B();

</span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$key</span> => <span>$value</span><span>) {
    </span><span>echo</span> '<br />'<span>;
    </span><span>echo</span> <span>$key</span> .',length: '.<span>strlen</span>(<span>$key</span>).' value: '.<span>$value</span><span>;
}</span>
PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

 

输出结果:

BA,length: 4 value: <span>private</span> property, <span>$A</span> of <span>class</span><span> B
AA</span>,length: 2 value: <span>public</span> property, <span>$AA</span> of <span>class</span><span> B
</span>*B,length: 4 value: <span>protected</span> property, <span>$B</span> of <span>class</span><span> B
AA</span>,length: 4 value: <span>private</span> property, <span>$A</span> of <span>class</span><span> A
</span>*C,length: 4 value: <span>protected</span> property, <span>$C</span> of <span>class</span> A

 

 

5、 逻辑运算总是返回 true 或 false (写多了 javascript 的人要注意),逻辑运算符优先级从高到低 为 &&、 ||、 and、 or ,逻辑运算符的短路效果可以使用语句中,但记住他们不会像 javascript 中那样返回一个 不是 boolean 类型的值,在表达式中使用要注意。

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル
<span>$a</span> = 1<span>;
</span><span>$b</span>=0<span>;
</span><span>$b</span> and <span>$a</span> = 100<span>;
</span><span>echo</span> <span>$a</span>; <span>//</span><span>1</span>
<span>$b</span> || <span>$a</span> = 200<span>;
</span><span>echo</span> <span>$a</span>; <span>//</span><span>200</span>
PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

 

 

 

6、switch 的比较不是 "===" 而是 "==" (在 javascript 中是 "===")

 

7、 在 php4 中,object 之间的比较方式与 array 相同,在 php5 中 , object 类型间的 "==" 比较为 true的前 提是,他们属于同一个类的实例(当然还要进行属性的比较,这类似标量的"==="比较),object 间的 "===" 比较为 true 的前提是他 们 就是同一个对象。

 

在 PHP4 中 ,不包括任何成员变量的对象 被 empty() 判断为 true

字符串偏移 offset 取字符的 empty() 判定: 取对应 offset 的字符进行判断,在PHP5.4 以前,使用索引从字符串中取字符时会先将索引进行取整,因此左侧不包含数字的字符串都被转换成0,PHP5.4之后,不再对非整形格式的字符串索引进行取整,因此判断为 true, 同理,isset() 判定为false. 如:

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル
<span>$str</span> = 'ab0d'<span>;
</span><span>empty</span>(<span>$str</span>[0]); <span>//</span><span>false</span>
<span>empty</span>(<span>$str</span>[0.5]); <span>//</span><span>false  索引被向下取整 为 0</span>
<span>empty</span>(<span>$str</span>["0.5"]); <span>//</span><span>false 索引被向下取整 为 0,PHP5.4之后不取证,判定为 true </span>
<span>empty</span>(<span>$str</span>[2]); <span>//</span><span>true ,取得的字符为 "0"</span>
<span>empty</span>(<span>$str</span>["3"]); <span>//</span><span>false ,取得的字符为 "d"</span>
<span>empty</span>(<span>$str</span>[4]); <span>//</span><span>true ,索引超出范围,notice 警告,但 empty() 会忽略警告</span>
<span>empty</span>(<span>$str</span>['a']); <span>//</span><span> false ,左侧不包含数字字符串索引 PHP5.4之前被处理为 $str[0],PHP5.4之后,直接为判定 true </span>
PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

 

无论是“不等于”还是”==“ ,不要在 PHP 的跨类型数据比较中使用”传递性“:

$a == $b; //true

$b == $c; //true

并不能说明 $a == $c 为 true

 

数组的比较方法

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル
<span>//</span><span> 数组是用标准比较运算符这样比较的</span>
<span>function</span> standard_array_compare(<span>$op1</span>, <span>$op2</span><span>)
{
    </span><span>if</span> (<span>count</span>(<span>$op1</span>) < <span>count</span>(<span>$op2</span><span>)) {
        </span><span>return</span> -1; <span>//</span><span> $op1 < $op2</span>
    } <span>elseif</span> (<span>count</span>(<span>$op1</span>) > <span>count</span>(<span>$op2</span><span>)) {
        </span><span>return</span> 1; <span>//</span><span> $op1 > $op2</span>
<span>    }
    </span><span>foreach</span> (<span>$op1</span> <span>as</span> <span>$key</span> => <span>$val</span><span>) {
        </span><span>if</span> (!<span>array_key_exists</span>(<span>$key</span>, <span>$op2</span><span>)) {
            </span><span>return</span> <span>null</span>; <span>//</span><span> uncomparable</span>
        } <span>elseif</span> (<span>$val</span> < <span>$op2</span>[<span>$key</span><span>]) {
            </span><span>return</span> -1<span>;
        } </span><span>elseif</span> (<span>$val</span> > <span>$op2</span>[<span>$key</span><span>]) {
            </span><span>return</span> 1<span>;
        }
    }
    </span><span>return</span> 0; <span>//</span><span> $op1 == $op2</span>
}
PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル

 

 

 

8、三元运算符 ?: ,跟其他大多数编程语言不一样,PHP 的三元运算符是左结合的!

PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル
    <span>$arg</span> = 'T'<span>;    
    </span><span>$vehicle</span> = ( ( <span>$arg</span> == 'B' ) ? 'bus' :<span>    
                 ( </span><span>$arg</span> == 'A' ) ? 'airplane' :<span>   
                 ( </span><span>$arg</span> == 'T' ) ? 'train' :<span>    
                 ( </span><span>$arg</span> == 'C' ) ? 'car' :<span>    
                 ( </span><span>$arg</span> == 'H' ) ? 'horse' :    
                 'feet'<span> );    
    </span><span>echo</span> <span>$vehicle</span>;   <span>//</span><span>horse</span>
PHP 比較演算と論理演算、PHP 演算ロジック_PHP チュートリアル


 

三元运算表达式被划分为

( <span>$arg</span> == 'B' ) ? 'bus' : ( <span>$arg</span> == 'A'<span> ) 
                                    </span>? 'airplane' : ( <span>$arg</span> == 'T'<span> ) 
                                                             </span>? 'train' : ( <span>$arg</span> == 'C'<span> )
                                                                               </span>? 'car' : ( <span>$arg</span> == 'H'<span> )
                                                                                                    </span>? 'horse' : 'feet' ;   

www.bkjia.com本当http://www.bkjia.com/PHPjc/1125682.html技術記事 PHPの比較演算と論理演算、PHPの演算ロジック1. empty()を使用して以下の値がtrueと判定されます:未割り当ての変数、未宣言の変数、0、"0"、""、false、null、空の配列array( ) ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。