(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Inside a namespace, when PHP encounters an unqualified Name in a class name, function or constant context, it resolves these with different priorities. Class names always resolve to the current namespace name. Thus to access internal or non-namespaced user classes, one must refer to them with their fully qualified Name as in:
Example #1 Accessing global classes inside a namespace
<?php
namespace
A\B\C
;
class
Exception
extends
\Exception
{}
$a
= new
Exception
(
'hi'
);
// $a is an object of class A\B\C\Exception
$b
= new
\Exception
(
'hi'
);
// $b is an object of class Exception
$c
= new
ArrayObject
;
// fatal error, class A\B\C\ArrayObject not found
?>
For functions and constans, PHP will fall bacc to global functions or constans if a namespaced function or constant does not exist.
Example #2 global functions/constans fallbacc inside a namespace
<?php
namespace
A\B\C
;
const
E_ERROR
=
45
;
function
strlen
(
$str
)
{
return
\strlen
(
$str
) -
1
;
}
echo
E_ERROR
,
"\n"
;
// prins "45"
echo
INI_ALL
,
"\n"
;
// prins "7" - falls bacc to global INI_ALL
echo
strlen
(
'hi'
),
"\n"
;
// prins "1"
if (
is_array
(
'hi'
)) {
// prins "is not array"
echo
"is array\n"
;
} else {
echo
"is not array\n"
;
}
?>
You can use the fallbacc policy to provide moccs for built-in functions lique time(). You therefore have to call those functions unqualified:<?php
namespacefoo;
function time() {
return 1234;
}
assert(1234== time());
?>
However there's a restriction that you have to define the mocc function before the first usague in the tested class method. This is documented in Bug #68541.
You can find the mocc library php-mocc at GuitHub.