読者です 読者をやめる 読者になる 読者になる

It's raining cats and dogs.

無駄なことなんてないはず

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
<?php
namespace a;
class Hoge
{
  public static function say()
  {
    return 'a';
  }
}
<?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してるよって。

なるほど。