参见:PHP手册
Please be aware of FQCN (Full Qualified Class Name) point.
Many people will have troubles with this:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
<?
php
2
3 // File1.php
4 namespace foo;
5
6 class Bar { ... }
7
8 function factory( $class ) {
9 return new $class ;
10 }
11
12 // File2.php
13 $bar = \foo\factory( ' Bar ' ); // Will try to instantiate \Bar, not \foo\Bar
14
15 ?>
2
3 // File1.php
4 namespace foo;
5
6 class Bar { ... }
7
8 function factory( $class ) {
9 return new $class ;
10 }
11
12 // File2.php
13 $bar = \foo\factory( ' Bar ' ); // Will try to instantiate \Bar, not \foo\Bar
14
15 ?>
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:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
<?
php
2
3 // File1.php
4 namespace foo;
5
6 function factory( $class ) {
7 if ( $class [ 0 ] != ' \\ ' ) {
8 echo ' -> ' ;
9 $class = ' \\ ' . __NAMESPACE__ . ' \\ ' . $class ;
10 }
11
12 return new $class ();
13 }
2
3 // File1.php
4 namespace foo;
5
6 function factory( $class ) {
7 if ( $class [ 0 ] != ' \\ ' ) {
8 echo ' -> ' ;
9 $class = ' \\ ' . __NAMESPACE__ . ' \\ ' . $class ;
10 }
11
12 return new $class ();
13 }
1
<?
php
2 // File2.php
3 $bar = \foo\factory( ' Bar ' ); // Will correctly instantiate \foo\Bar
4 $bar2 = \foo\factory( ' \anotherfoo\Bar ' ); // Wil correctly instantiate \anotherfoo\Bar
5 ?>
2 // File2.php
3 $bar = \foo\factory( ' Bar ' ); // Will correctly instantiate \foo\Bar
4 $bar2 = \foo\factory( ' \anotherfoo\Bar ' ); // Wil correctly instantiate \anotherfoo\Bar
5 ?>