目玉焼きに塩

おいしい

【読書メモ】パーフェクトPHP(3章 型と演算子)

『パーフェクトPHP』「3章 型と演算子」の読書メモ。

文字列(p.60)

  • ヒアドキュメント
    … 複数行にまたがる長い文字列を定義する一つの方法。

  • Nowdoc
    … 変数展開がされないヒアドキュメントのようなもの。


null(p.66)

「nullを代入した変数」と「unset()で割り当てを解除された変数」

本質的に2つの値は等価だが、挙動が異なってくる。

<?php
$var = null;
var_dump($var); // null。

unset($var);
var_dump($var); // 値としてはnull。だがunsetによりE_NOTICE(Undefined variable)が発生する。


型変換(p.67)

文字列を数値型へ明示的にキャストする

文字列先頭の数字から、数字の終わりまでを値として返す。先頭が文字であれば0となる。

<?php
echo (int)"15foo";     // 15 
echo (int)"15.5foo";   // 15
echo (float)"15.5foo"; // 15.5
echo (int)"foo";       // 0
echo (int)"foo15";     // 0


文字列のキャスト

下記のコードを実行すると「"0.0"と"0"は等しい」と表示される。

<?php
if ('0.0' == '0') {
  echo '"0.0"と"0"は等しい';
}

これは、二項演算を行う際に2つの項とも「数値らしき文字列」の場合、「整数型または浮動小数点数型へとキャストする」性質がPHPにあるため。


 ① '0.0' が浮動小数点数型の 0.0 にキャストされる。
 ② '0' が整数型の 0 にキャストされる。
 ③ 0.0 と 0 の比較により、0 が 浮動小数点数型の 0.0 にキャストされる。
 ④ 比較の結果trueになる。

というからくり。
こうした、自動キャストによる値の変換で思いもよらない結果が起こりえるため、基本的には===or!==で厳密に比較するべき


PHP演算子(p.70)

  • 四則演算において0で割り算をした場合、Warning: Division by zeroが発生する。この時の返り値は論理値のfalseになる。

  • 文字列演算子(ドット)で、整数を文字列として結合する場合はスペースを空ける必要がある(数値が浮動小数点数型とみなされエラーとなるため)。

<?php
$tom = 'Tom is ' . 15 . ' years old.'; // Tom is 15 years old.
$bob = 'Bob is ' .16. ' years old'; // PHP Parse error:  syntax error, unexpected '.16' (T_DNUMBER)


演算子

instanceof。変数が、「特定のクラス」or「特定のインターフェースを実装したクラス」のインスタンスであるかどうかを判定し、論理値を返す。

<?php
interface FooInterface {}

class ParentFoo {}

class Foo extends ParentFoo implements FooInterface {}

class Bar {}

$a = new Foo();
var_dump($a instanceof Foo);          // bool(true)
var_dump($a instanceof ParentFoo);    // bool(true)
var_dump($a instanceof FooInterface); // bool(true)
var_dump($a instanceof Bar);          // bool(false)


三項演算子(p.77)

三項演算子の結合規則

PHP三項演算子は 左 辺 か ら 評 価 さ れ る。
前にハマったので覚えてる〜!!気をつけましょう。


その他の演算子(p.81)

エラー制御演算子

@。その式で発生するエラーを制御し、エラーを表示させない。

<?php
$var = @$_GET['foo'];

ここでfooパラメーターが取得できない等でエラーが発生しても、制御演算子を付けているためエラーが表示されない。
(この演算子なんであるんだろう…使う場面がイメージできない)