PHP の namespace と use と as について
難解な PHP の namespace と use について理解したので、もしも誰かが悩んでいたら参考にしていただけると嬉しいです。
namespace とは?
PHP の namespace
は、もしも同じ名前のクラスや関数が複数存在する場合に、それらを区別するための仕組みです。と言っても、良くわからないのが namespace 実際に説明してみないと解らないので、実際にコードを書いてみます。
namespace \App\Base;
base.php に namespace を定義する、これが namespace (名前空間) です。
use とは?
use \App\Base\design;
namespace した ファイルを使うために、use を使います。use
は、namespace を使うためのキーワードです。定義の仕方は namespace の時に書いた要素を使います。
どうやって使うの?
base.phpnamespace \App\Base;
class design {
public static fuction menu(){
echo "design";
}
}
index.phpuse \App\Base\design;
// 関数 menu() を呼び出す
design::menu();
出力design
[ base.php ] の namespace ( \App\Base
)を定義して、
[ index.php ] で use ( namespace
名 + class
名 ) を使って呼び出す。これが PHP の namespace と use の基本的な使い方となります。
namespace することによるメリット
認識性の向上
その PHP で定義されているクラス名を序盤で理解することができます。
// base.php の classuse \App\Base\design;
use \App\Base\backend;
// journal-base.php の classuse \App\journal-base\journal;
use \App\journal-base\post;
use \App\journal-base\comment;
現在のファイルがどの namespace に属しているのかを明示的に示すことができるので、コードの可読性が向上します。
名前の衝突を避ける
個人でプログラミングしてるときにはめったに関数名で被ることはないですが、同じようなプロジェクトしてるときに時々、関数名が被ることがあります。
people-a.phpclass people {
function user('name'){
return $name . 'くん';
}
}
people-b.phpclass people {
function user('name'){
return $name . 'ちゃん';
}
}
// こんな感じで、同じ名前のクラスがあった場合、衝突してしまいます。
そんなときに namespace を使うことで、名前の衝突を避けることができます。
people-a.phpnammespace \People\Name\boy
class people {
function user('name'){
return $name . 'くん';
}
}
people-b.phpnammespace \People\Name\girl
class people {
function user('name'){
return $name . 'ちゃん';
}
}
そうすると、
use \People\Name\boy\people;
echo people::user('太郎'); // 太郎 くん
use \People\Name\girl\people;
echo people::user('花子'); // 花子 ちゃん
となるわけですね。
これで、同じ名前のクラスがあっても、namespace を使うことで名前の衝突を避けることができるわけでありますね。
as って何?
as
は、namespace を使うときに、名前を短くするためのキーワードとなっております。use \App\Base\design as d;
d::menu();
class 名をオリジナルの名前に変更したり、省略したりして使うことができる機能になっております。
ただこのへんは好みがわかれるので個人次第ですね。
まとめ
最初、 namespace とは class の上位にいる最終の親みたいなイメージを持っていましたが、実際はグループを分けるためのものだと理解しました。
PHP の namespace は Java の package と違って namespace の覚えやすい名前をつけることができるので、名前が [ App ] でもいいですし [ App\Design ] でもいいですし、[ App\Design\Menu ] と長々と要素を足して行ってもいいのが良いところですかね。
少しでも見やすいコードをかけるように一つづつ覚えていきたいです。