たけるのプログラミング

作ったものとか、気ままにアップします。

【PHP】名前空間とエイリアスについて再確認の巻

参考
【PHP超入門】名前空間(namespace・use)について - Qiita
PHP: 名前空間 - Manual


以下のようなコードだとエラーが起きる

try.php

<?php
require_once 'lebron.php';
require_once 'curry.php';

shoot();

lebron.php

<?php
function shoot()
{
    echo '2ポイントシュート';
}

curry.php

<?php
function shoot()
{
    echo '3ポイントシュート';
}

shoot()と言われてもlebronのshootか、curryのshootか分からない(名前の衝突が起こっている)のでエラーとなる。なので名前空間を利用してエラーを回避する。

try.php

<?php
require_once 'lebron.php';
require_once 'curry.php';

lebron\shoot();
curry\shoot();

lebron.php

<?php
namespace lebron;

function shoot()
{
    echo '2ポイントシュート';
}

curry.php

<?php
namespace curry;

function shoot()
{
    echo '3ポイントシュート';
}


こんな感じにディレクトリ感覚で指定もできる。
try.php

<?php
namespace nba;

require_once 'lebron.php';
require_once 'curry.php';

//修飾形式
lakers\forward\shoot();
warriers\guard\shoot();

//完全修飾形式
\nba\lakers\forward\shoot();
\nba\warriers\guard\shoot();

lebron.php

<?php
namespace nba\lakers\forward;

function shoot()
{
    echo '2ポイントシュート';
}

curry.php

<?php
namespace nba\warriers\guard;

function shoot()
{
    echo '3ポイントシュート';
}


また例えば名前空間が長い時
lebron.php

<?php
namespace sports\basketball\nba\lakers\forward;

function shoot()
{
    echo '2ポイントシュート';
}

try.php

<?php
require_once 'lebron.php';
require_once 'curry.php';

sports\basketball\nba\lakers\forward\shoot();

長い名前空間の時いちいち書くのがめんどくさいので、useを使ってエイリアスを作成し楽をする。

<?php
require_once 'lebron.php';
require_once 'curry.php';

//やり方①
use sports\basketball\nba\lakers\forward as king;
//やり方②
use sports\basketball\nba\warriers\guard;

king\shoot();
guard\shoot();