演算子など
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{}
はエラーになる。
クラス名の指定方法
- 相対パス
同じ名前空間で定義されているクラスが呼び出される。namespase Hoge;
new DateTime(); // \Hoge\DateTime
- 絶対パス
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');