2012-12-14 65 views
1

我在Codeigniter HMVC扩展中(通过Wiredesignz)发现了这样一行代码,其中一个类实例化时没有分配给变量(Base.php中的类CI)没有赋值给一个变量的PHP类的实例化

代码:

class CI extends CI_Controller 
{ 
    public static $APP; 

    public function __construct() { 

    /* assign the application instance */ 
    self::$APP = $this; 

    global $LANG, $CFG; 

    /* re-assign language and config for modules */ 
    if (! is_a($LANG, 'MX_Lang')) $LANG = new MX_Lang; 
    if (! is_a($CFG, 'MX_Config')) $CFG = new MX_Config; 

    parent::__construct(); 
    } 
} 

/* create the application object */ 
new CI; 

这是什么技术的名字吗? 这是什么意思?

+1

如果是这样的笨我只是失去了兴趣,学习它,甚至与它有任何共同之处。 – shadyyx

+2

@shadyyx阅读问题的第一行。 –

+0

@Vlakarados它是一个扩展,所以不是真正的CI?但我想CI仍然使用'全球'然后... – shadyyx

回答

5

这没有一个名字,其含义是,构造函数肯定是做了太多。人们想要在不引用它的情况下创建一个类的实例的原因是,他只希望构造函数想要被执行,但仅此而已。这意味着,构造函数“做”了某些事情,但构造函数应该只能确保对象处于稳定/有效状态,而不再是其他事情。

简而言之:不要以为这是一个很好的做法。 globalself::$APP = $this证实了我的意见,这是一段糟糕的代码。

+0

对不起,但您是否真的有意将该逗号放在最后一句中? :) –

+0

我确实同意,非常糟糕的一段代码。而且非常糟糕的做法。 – shadyyx

+0

啊,现在我明白了,谢谢。不是母语和标点符号......甚至不用我的语言:D – KingCrunch

0

我想这可以被看作是某种facade design。 - 类(构造函数被调用)和赋值完成,虽然在构造函数本身。

所以new CI只是扩展Super对象并初始化它自己的构造函数。 的功能类似,function somefun(){ return }; somefunc();//call somefunc

是CI_Controller加载所有运行笨所需的类,它是SUPER对象

$ci = &get_instance() // CI_Controller 
+0

让我感到困惑的是CI的实例化,而没有将它分配给变量... 已经有一个CI_Controller类型的index.php中声明了$ CI。 现在是CI类型的CI。 CI和$ CI都是对象,后者是一个变量,但前者呢? 它是如何管理的PHP? 起初我想也许它是单身人士,但在任何其他地方,任何人都可以声明另一个类型为CI的对象,但这次他可能必须将它分配给一个变量。 尽管...使用Jens Segers中的一个删除了扩展名。 –

相关问题