「レベルアップPHP」の感想・備忘録2

スポンサーリンク
「レベルアップPHP」の感想・備忘録1の続き

演算子など

Null合体演算子??(PHP7.0)

if (!isset($xxx))の判定を簡略化することができる。
変数が未定義またはNULLの場合に初期値を与えるための演算子。

!isset($xxx) ? '初期値' : $xxx

$xxx ?? '初期値'
と書くことができる。

エルビス演算子?:

if (!$xxx)の判定を簡略化することができる。
!$xxx ? '空っぽ' : $xxx

$xxx ?: '空っぽ'
と書くことができる。

if (!$xxx)の判定であるため、未定義の変数で使うとNoticeが発生するので注意。

引数の末尾カンマ(PHP7.3)

末尾のカンマが許容されるようになった。
max(1, 2, 3,);

データ型

暗黙的型変換

==による文字列と数値の比較では、文字列が数値に変換される。
if ('A' == 0)はtrueとなる。

文字列変数をifで判定すると、文字列がbooleanに変換される。
if ('A')はtrueとなる

緩やかな比較は使わずに、厳密な比較を使うべきである。
switch文は緩やかな型比較が行われるため、文字列では使うべきではない。

型宣言(PHP7.0)

関数の引数と戻り値に型を指定することができる。
型が違う場合はTypeErrorがスローされる。
?Datetimeのように型の前に?をつけるとNULLも許容される。(PHP7.1)

配列の場合は、配列の中身までを型宣言することができない。
現状では、配列を引数で受け取らないように頑張るしかない。

PHP5ではタイプヒンティングと呼ばれていたが、PHP7からは型宣言という呼び名に統一された。
タイプヒンティングでは、スカラー型の型を指定することができなかった。
PHP7.4ではクラスのプロパティも型宣言できるようになった。
public int $id;

宣言可能なデータ型

  • クラス名
  • インターフェイス名
  • self
  • array
  • callable

PHP7.0から宣言可能

  • bool
  • float
  • int
  • string

PHP7.1から宣言可能

  • iterable
  • void(戻り値)

弱い型付けと強い型付け

デフォルトでは弱い型付けであり、暗黙的型変換が行われる。
例えばint型の型宣言の場合は「数値に変換できるもの」であり、’123qbc’などの文字列も許容されてしまう。

ファイルの先頭にdeclare(strict_types=1);を記述すると強い型付けとなる。
面倒だが、基本的には全てのファイルに記述するべきである。

名前空間

名前空間の基本

namespaceを定義していない場合、PHP組み込みの関数・クラスと同じ名前を使うことはできない。
class DateTime{}はエラーになる。

クラス名の指定方法

  1. 相対パス
    同じ名前空間で定義されているクラスが呼び出される。
    namespase Hoge;
    new DateTime(); // \Hoge\DateTime
  2. 絶対パス
    new \Hoge\DateTime();
    ※ PHP組み込みのクラスの場合は、先頭にバックスラッシュを付ける
    new \DateTime();
    先頭のバックスラッシュはデフォルト名前空間を意味する。

use演算子

namespace Hoge;
class UseTest{}

として別ファイルで

use Hoge\UseTest;
require_once './UseTest.php';
$useTest = new UseTest();

PHP7.0からは同じ名前空間のクラスをまとめて記述できるようになった。
use Hoge\{ClassA, ClassB};

オートロード

オートロードの基本

spl_autoload_register()で関数を登録すると、インクルードされていないクラスのインスタンスをnewで生成した際に、登録された関数が実行される。
関数にinclude処理をまとめておくことで、クラスのファイルをどこに置くかなどを1箇所で管理することができる。
自動でクラスファイルを探しに行ってくれる仕組みをオートロードという。
通常はcomposerやフレームワークに付属しているオートロードを使うため、自分でspl_autoload_registerを使ってオートロードを定義することはない。

spl_autoload_register(function($classname){
    $autoloadConfig = [
        'Hoge\Sample' => __DIR__ . DIRECTORY_SEPARATOR. 'Sample.php'
    ];
    if (isset($autoloadConfig[$classname])) {
        include($autoloadConfig[$classname]);
    }
});

正規表現

PCREとPOSIX

POSIX正規表現であるereg関数群はPHP7で削除された。
PCRE(Perl Compatible Regular Expressions)のpreg関数群を使わなければならない。

日本語を扱う場合はu修飾子を付ける。
mb_ereg関数群はPHP7でも使えるが、デリミタが不要など少し癖がある。
pregにu修飾子を付ける方が無難である。

preg_quote関数

正規表現のメタ文字をエスケープしたい場合は、preq_quote関数が便利である。
preg_replace('/' . preg_quote('a*b') . '/', 'c', 'a*b*1*2');

コメント