PHP: 名前空間

PHP: 名前空間

October 5, 2020
PHP
PHP

名前空間を作成する #

my\ns という名前空間を定義する。

my_ns.php

<?php
namespace my\ns;

class MyClass {
  function __toString() {
    return "from MyClass";
  }
}

function myFunc() {
  return "from myFunc";
}

const MY_CONST = "from MY_CONST";

名前空間経由でアクセスする #

<?php
include('my_ns.php');

echo new my\ns\MyClass . "\n";
echo my\ns\myFunc() . "\n";
echo my\ns\MY_CONST . "\n";
from MyClass
from myFunc
from MY_CONST

名前空間に定義できるもの #

  • class
  • interface
  • trait
  • function
  • const

use キーワード #

短い名前で利用可能となるよう、現在の名前空間へ import が可能。

<?php
include('my_ns.php');

use my\ns\MyClass;
use function my\ns\myFunc;
use const my\ns\MY_CONST;

echo new MyClass . "\n";
echo myFunc() . "\n";
echo MY_CONST . "\n";

別名で import もできる。

<?php
include('my_ns.php');

use my\ns\MyClass as MyC;
use function my\ns\myFunc as myF;
use const my\ns\MY_CONST as MY_C;

echo new MyC . "\n";
echo myF() . "\n";
echo MY_C . "\n";

Group use #

PHP 7.0+ からまとめて import 可能になった。

my_ns.php

<?php
namespace my\ns;

class MyClassA { function __toString() { return "from MyClassA"; } }
class MyClassB { function __toString() { return "from MyClassB"; } }
class MyClassC { function __toString() { return "from MyClassC"; } }

function myFuncA() { return "from myFuncA"; }
function myFuncB() { return "from myFuncB"; }
function myFuncC() { return "from myFuncC"; }

const MY_CONST_A = "from MY_CONST_A";
const MY_CONST_B = "from MY_CONST_B";
const MY_CONST_C = "from MY_CONST_C";
<?php
include('my_ns.php');

use my\ns\{MyClassA, MyClassB, MyClassC as MyCC};
use function my\ns\{myFuncA, myFuncB, myFuncC as myFC};
use const my\ns\{MY_CONST_A, MY_CONST_B, MY_CONST_C as MY_C_C};

echo new MyClassA . "\n";
echo new MyClassB . "\n";
echo new MyCC . "\n";
echo myFuncA() . "\n";
echo myFuncB() . "\n";
echo myFC() . "\n";
echo MY_CONST_A . "\n";
echo MY_CONST_B . "\n";
echo MY_C_C . "\n";
from MyClassA
from MyClassB
from MyClassC
from myFuncA
from myFuncB
from myFuncC
from MY_CONST_A
from MY_CONST_B
from MY_CONST_C

名前空間のアクセス方法と名前解決のルール #

  • Unqualified name (e.g. Foo )
    • Foo が import されていたらそれ
    • import されていなかったら現在の名前空間から解決される
  • Qualified name (e.g. Foo\Bar )
    • Foo が import されていたらその名前空間から解決される
    • import されていなかったら現在の名前空間から解決される
  • Fully qualified name (e.g. \Foo\Bar )
    • 現在の名前空間に係わらず TOP レベル名前空間から解決される
  • Relative name (e.g. namespace\Foo\Bar )
    • 現在の名前空間から解決される