namespaceを調べる
今更感あるけど、PHPのバージョンを上げたいなと思ってphp5.3以上の機能を調べてる。
異なるnamespaceにある同じクラス名のクラスを両方requireした時に、namespace指定せずにそのクラスを呼び出せるのか?また呼び出せるのであればどちらのクラスが呼ばれるのか?
検証用に使った環境
$ php -v PHP 5.4.9 (cli) (built: Dec 4 2012 20:46:40) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans
- ./a/Hoge.php
<?php namespace a; class Hoge { public static function say() { return 'a'; } }
- ./b/Hoge.php
<?php namespace b; class Hoge { public static function say() { return 'b'; } }
- ./namespace_test.php
<?php require_once __DIR__ . '/a/Hoge.php'; require_once __DIR__ . '/b/Hoge.php'; echo Hoge::say();
で、実行してみる
$ php namespace_test.php PHP Fatal error: Class 'Hoge' not found in /path/to/namespace_test.php on line 7
クラスが見つからないって怒られた。
結局requireしたところでa,bそれぞれのnamespaceにあるHogeクラスなわけだから、namespaceを指定してクラスを指定しないとグローバルなnamespaceからは呼び出せないよね。要は、
<?php require_once __DIR__ . '/a/Hoge.php'; require_once __DIR__ . '/b/Hoge.php'; echo a\Hoge::say();
とか
<?php require_once __DIR__ . '/a/Hoge.php'; require_once __DIR__ . '/b/Hoge.php'; use a; echo Hoge::say();
みたいに明示的にnamespaceを指定しないといけない。そりゃそうだ。
ちなみに、以下のようにa,b両方共useするとどうなるか
<?php require_once __DIR__ . '/a/Hoge.php'; require_once __DIR__ . '/b/Hoge.php'; use a\Hoge; use b\Hoge; echo Hoge::say();
$ php namespace_test.php PHP Fatal error: Cannot use b\Hoge as Hoge because the name is already in use in /path/to/namespace_test.php on line 6
怒られた。もうuseしてるよって。
なるほど。