Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPの名前空間(namespace)

Avatar for ashibe ashibe
July 27, 2025
44

 PHPの名前空間(namespace)

PHP勉強会in広島 Vol.4の登壇資料

Avatar for ashibe

ashibe

July 27, 2025

Transcript

  1. 「名前空間」とは何か? 名前空間とは何でしょう ? 広義の「名前空間」とは、項目をカプセル化するもののことです。 これは多くの場面で見られる抽象概念です。 たとえば、たいていの OS はディレクトリでファイルをグループ化します。 この場合、ディレクトリがその中のファイルの名前空間として機 能しています。

    具体的に言うと、 foo.txt というファイルは /home/greg と /home/other の両方に存在することが可能ですが、それ らふたつの foo.txt を同じディレクトリに配置することはできません。 さらに、/home/greg ディレクトリの外から foo.txt にアクセス するには、ディレクトリ名をファイル名の前につけて /home/greg/foo.txt としなければなりません。 プログラミングの世界における名 前空間も、この延長線上にあります。 引用:名前空間の概要( PHPマニュアル:https://www.php.net/manual/ja/language.namespaces.rationale.php) 簡単にいうと、「住所のようなもの」です。
  2. 「名前空間」とは何か? 名前空間のない世界 // User.php(ECサイト用) class User { public function purchase()

    { } } // User.php(ブログ用) class User { // Fatal error: Cannot redeclare class public function writePost() { } } // index.php require_once 'models/User.php'; require_once 'models/Product.php'; require_once 'models/Order.php'; require_once 'controllers/UserController.php'; require_once 'controllers/ProductController.php'; // ... 数十個のrequire文
  3. 「名前空間」とは何か? PHPは同じ名前のクラス名は定義できない? study.php <?php require_once 'jane.php'; require_once 'john.php'; $user =

    new User(); echo "Name: " . $user->getName() . "\n"; echo "Email: " . $user->getEmail() . "\n"; // Fatal error: Cannot redeclare class User // (previously declared in /var/www/html/uuser.php:3) // in /var/www/html/user.php on line 3 ご覧の通り、PHPでは同じクラス名を使うことはできません。
  4. 「名前空間」とは何か? PHPは同じ名前の関数は定義できない? study.php ご覧の通り、PHPでは同じ関数名を使うことはできません。 <?php require_once 'someone.php'; require_once 'anyone.php'; echo

    getGreeting(); // Fatal error: Cannot redeclare function getGreeting() // (previously declared in /var/www/html/someone.php:3) // in /var/www/html/anyone.php on line 3
  5. 名前空間の外側で命令文を書くことができるのか? 先ほどの記述の最後に echo 文を追記すると、Fatal errorになります。 先ほどの方法より、わかりやすくなっていますが、 なるべく一つのファイルでは一つの名前空間にするのが わかりやすいです。 <?php namespace

    Study { function getGreeting() { return 'こんにちは '; } } namespace Rest { function getGreeting() { return 'おやすみ'; } } echo "Hello"; // Fatal error: No code may exist outside of namespace {} // in /var/www/html/namespaces.php on line 14
  6. 複数のファイルで同じ名前空間を使える? study.phpで利用しようとすると、 two.phpのOneはすでにone.phpで宣言されているので利用できないと Fatal errorが発生します。 <?php require_once 'one.php'; $one =

    new One\One(); require_once 'two.php'; $two = new One\One(); // One class instantiated. // Fatal error: Cannot redeclare class One\One (previously declared // in /var/www/html/one.php:3) in /var/www/html/two.php on line 3 同じ名前空間になるので、同名の関数などは定義できません。しかし、名前は一般的なものであれば重 複する可能性は大いにあります。サブ名前空間を利用することで解消します。
  7. ここまでの内容でPHPの名前空間の使い方は理解できたのではないかと思います。 なぜ名前空間が必要なのか? 1. 名前の衝突を防ぐ 2. プレフィックス地獄を防ぐ 3. グローバル空間の汚染を防ぐ -> 小規模な個人開発レベルであれば、なくてもどうにかなります。

    大規模プロジェクトなどでは「チーム開発で名前の調整が必要」「サードパーティライブラリとの競合」「コード の可読性低下」などの負担を下げるためにも、名前空間が必要です。 最初の方に小出ししましたが、 PHP5.3(2009年)PHPには名前空間が追加されています。 これはSymfony、Zendなど大規模フレームワークの登場により、必要不可欠になったからだそうです。 名前空間をよく理解して、良い開発体験を!! まとめ