PHP 5.4.36 Released

名前空間の使用法: グローバル関数/定数への移行

(PHP 5 >= 5.3.0)

名前空間内で、PHP が未定義のクラス名や関数、定数に出会った場合、 それぞれに応じて異なる優先順位で解決を行います。 クラス名は、常に現在の名前空間での名前として解釈されます。 したがって、内部クラスあるいは名前空間に属さないクラスにアクセスするには 次のように完全修飾名で指定しなければなりません。

例1 名前空間内からのグローバルクラスへのアクセス

<?php
namespace A\B\C;
class 
Exception extends \Exception {}

$a = new Exception('hi'); // $a は A\B\C\Exception クラスのオブジェクトです
$b = new \Exception('hi'); // $b は Exception クラスのオブジェクトです

$c = new ArrayObject// fatal error, class A\B\C\ArrayObject not found
?>

関数や定数の場合、名前空間内にその関数や定数が見つからなければ PHP はグローバル関数/定数を探します。

例2 名前空間内からのグローバル関数/定数への移行

<?php
namespace A\B\C;

const 
E_ERROR 45;
function 
strlen($str)
{
    return \
strlen($str) - 1;
}

echo 
E_ERROR"\n"// "45" と表示します
echo INI_ALL"\n"// "7" と表示します - グローバルの INI_ALL に移行しました

echo strlen('hi'), "\n"// "1" と表示します
if (is_array('hi')) { // "is not array" と表示します
    
echo "is array\n";
} else {
    echo 
"is not array\n";
}
?>

add a note add a note

User Contributed Notes 2 notes

up
2
markus at malkusch dot de
18 days ago
You can use the fallback policy to provide mocks for built-in functions like time(). You therefore have to call those functions unqualified:

<?php
namespace foo;

function
time() {
    return
1234;
}

assert (1234 == time());
?>

However there's a restriction that you have to define the mock function before the first usage in the tested class method. This is documented in Bug #68541.

You can find the mock library php-mock at GitHub.
up
-6
cory at xison dot ca
7 months ago
I want to throw it out there, I found the following easier to deal with when porting parts of some older code into a new project in regards to accessing global classes.

<?php
namespace app\somethingorother;
use \
core as core;

core::set_something();

?>

I know it's not exactly the same as the solutions mentioned above, but it works for what I'm trying to accomplish.
To Top