名前空間
名前空間とは
- 名前の集合を分割することで衝突の可能性を低減しつつ参照を容易にする概念
- Git等、ライブラリやフレームワークをすることが多くなり、異なる開発者が命名した名前と衝突する可能性が高まっている
名前空間の宣言
- namespace キーワードを他のコードより前(ファイルの先頭)で宣言する
- スペースやHTMLも例外ではない
- インターフェース、クラス、定数、関数はすべて名前空間内に属することになる
名前空間の参照
- 名前空間に属する名称を参照するには「完全修飾名」、「修飾名」、「非修飾名」のいずれかの方法を利用する
- 名前空間を宣言したコードから、PHP組み込みクラスなどで名前空間に属さない(グローバルな名前空間に属している)クラスを参照する場合は、先頭にバックスラッシュをつけて完全修飾名とする必要がある。完全修飾名にしないと非修飾名として扱わ割れてしまう
定義 | サンプル | 内容 | 解釈される名前 |
完全修飾名 | \Project\Foo,\Foo | 修飾名のうち、先頭にバックスラッシュが付いているもの | \Project\Foo |
修飾名 | Project\Foo | 名前空間の区切り文字を含む | 現在の名前空間+\Project\Foo |
非修飾名 | Foo | 名前空間の区切り文字を含まない | 現在の名前空間+\Foo |
名前空間のインポート、エイリアス
異なる名前空間が混在する場合、毎回完全修飾名で参照するのは冗長です。
use文を使うと、名前空間をインポートしたり、エイリアス(別名)を作成して、簡潔な表記でクラスを参照できる
use文を使うと、名前空間をインポートしたり、エイリアス(別名)を作成して、簡潔な表記でクラスを参照できる
- namespace Foo;
-
- use Project1\Bar;
- use Project2\Foo as Project2Foo;
-
- $bar = new Bar();
-
- $foo = new Project2Foo();
-
クロージャ
クロージャとは
- 無名関数、ラムダ
- クロージャを使うと関数名を指定せずに関数を作成することができ、関数やメソッドへ渡すことができる。
- 関数のコールバックとして関数呼び出しの際に簡潔に記述できる
コールバックとしてつかう
- return $v % 2 == 0;
- });
-
変数に代入する
- $func = function($message){
- echo $message.PHP_EOL;
- };
- $func('Hello'); //Hello
-
- クロージャ定義の後にはセミコロンが必須
- クロージャは定義した段階では内部のコードは実行されない。代入した変数に()をつける関数として実行される。
useで外部スコープの変数を参照する
- useキーワードを使うとクロージャの外部スコープにある変数を参照することができる
- クロージャ定義後に変数の値を変更してもクロージャ内の値は変わらない
- クロージャ実行時の変数の値を参照したい場合、useキーワードで指定する変数を参照渡しの形式で記述する
- 参照渡しで変数を指定すると、外部スコープの変数値をクロージャ内から変更することもできる
- $name = 'Jun';
-
- $func = function($message) use ($name) {
- echo $message.' '.$name.PHP_EOL;
- };
-
- $func('Hello'); //Hello Jun
-
- $name = 'Mike';
- $func('Hello'); //Hello Jun
-
- function counter() {
- $i = 0;
- return function() use (&$i){
- $i++;
- return $i;
- };
- }
-
- $counter = counter();
- echo $counter().PHP_EOL; //1
- echo $counter().PHP_EOL; //2
- echo $counter().PHP_EOL; //3
-