as noted by guilhermeblanco at php dot net,
<?php
// fact.php
namespace foo;
class fact {
public function create($class) {
return new $class();
}
}
?>
<?php
// bar.php
namespace foo;
class bar {
...
}
?>
<?php
// index.php
namespace foo;
include('fact.php');
$foofact = new fact();
$bar = $foofact->create('bar'); // attempts to create \bar
// even though foofact and
// bar reside in \foo
?>
Espacios de Nombres y características dinámicas del lenguaje
La implementación de PHP de los espacios de nombres está influenciada por su naturaleza dinámica como lenguaje de programación. Así, para convertir código como el del siguiente ejemplo en código de espacios de nombres:
Example #1 Acceder dinámicamente a elementos
ejemplo1.php:
<?php
class nombreclase
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function nombrefunc()
{
echo __FUNCTION__,"\n";
}
const nombreconst = "global";
$a = 'nombreclase';
$obj = new $a; // imprime nombreclase::__construct
$b = 'nombrefunc';
$b(); // imprime nombrefunc
echo constant('nombreconst'), "\n"; // imprime global
?>
Example #2 Acceder dinámicamente a elementos de un espacio de nombres
<?php
namespace nombreespaciodenombres;
class nombreclase
{
function __construct()
{
echo __METHOD__,"\n";
}
}
function nombrefunc()
{
echo __FUNCTION__,"\n";
}
const nombreconst = "de espacio de nombres";
include 'ejemplo1.php';
$a = 'nombreclase';
$obj = new $a; // imprime nombreclase::__construct
$b = 'nombrefunc';
$b(); // imprime nombrefunc
echo constant('nombreconst'), "\n"; // imprime global
/* observe que si se usan comillas dobles, se debe usar "\\nombreespaciodenombres\\nombreclase" */
$a = '\nombreespaciodenombres\nombreclase';
$obj = new $a; // imprime nombreespaciodenombres\nombreclase::__construct
$a = 'nombreespaciodenombres\nombreclase';
$obj = new $a; // también imprime nombreespaciodenombres\nombreclase::__construct
$b = 'nombreespaciodenombres\nombrefunc';
$b(); // imprime nombreespaciodenombres\nombrefunc
$b = '\nombreespaciodenombres\nombrefunc';
$b(); // también imprime nombreespaciodenombres\nombrefunc
echo constant('\nombreespaciodenombres\nombreconst'), "\n"; // imprime de espacio de nombres
echo constant('nombreespaciodenombres\nombreconst'), "\n"; // también imprime de espacio de nombres
?>
Asegúrese de leer la nota sobre escapar nombres de espacios de nombres en cadenas.
scott at intothewild dot ca
07-Aug-2009 10:33
guilhermeblanco at php dot net
16-Jun-2009 07:04
Please be aware of FQCN (Full Qualified Class Name) point.
Many people will have troubles with this:
<?php
// File1.php
namespace foo;
class Bar { ... }
function factory($class) {
return new $class;
}
// File2.php
$bar = foofactory('Bar'); // Will try to instantiate \Bar, not \foo\Bar
?>
To fix that, and also incorporate a 2 step namespace resolution, you can check for \ as first char of $class, and if not present, build manually the FQCN:
<?php
// File1.php
namespace foo;
function factory($class) {
if ($class[0] != '\\') {
echo '->';
$class = '\\' . __NAMESPACE__ . '\\' . $class;
}
return new $class();
}
// File2.php
$bar = foofactory('Bar'); // Will correctly instantiate \foo\Bar
$bar2 = foofactory('\anotherfoo\Bar'); // Wil correctly instantiate \anotherfoo\Bar
?>
