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

PHPの名前空間(namespace)

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ashibe ashibe
July 27, 2025
41

 PHPの名前空間(namespace)

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

Avatar for ashibe

ashibe

July 27, 2025
Tweet

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など大規模フレームワークの登場により、必要不可欠になったからだそうです。 名前空間をよく理解して、良い開発体験を!! まとめ