PHP中实现工厂类模式遭遇命名空间无法正确创建相应的解决代码
参见:PHP手册
Please be aware of FQCN (Full Qualified Class Name) point.
Many people will have troubles with this:
代码
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 ?>
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:
代码
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 }
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 ?>

浙公网安备 33010602011771号