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 ?>

posted on 2010-11-09 21:50  陆西星  阅读(379)  评论(0)    收藏  举报

导航