2012-04-22 76 views
9

我已经开始玩CodeIgniter了。 我使用他们的用户指南和其他第三方教程供学习。我有点卡在私人功能的命名上。基于the user guide,我必须以私人功能的名称为前缀_。但in this tutorial,检查添加注销部分。其中有一个私人功能:private function check_isvalidated()。在这里,它没有以字符_作为前缀。CodeIgniter - 私人功能

那么这也是一个公认的命名约定? 与此同时,还有一个叫_output()Processing Output。 这是一个具有私有函数命名约定的公共函数!

这是一个有点当我尝试以系统化的方式来学习混淆的。

回答

27

_前缀是在CONTROLLER定义的函数的约定。

用户指南说:

在某些情况下,你可能想从公共访问隐藏的某些功能。要使某个功能成为专用,只需添加一个下划线作为名称前缀,并且不会通过URL请求提供。

http://www.codeigniter.com/user_guide/general/controllers.html#private-methods

添加一个_是CodeIgniter的自己的控制器中的(仅在控制器)声明函数的方式,不能由用户直接调用:

  • Controller函数被映射到部分网址(controller/function
  • 控制器中有功能,不应映射到URL

    - they are declared as `private` (available since PHP5) 
    OR 
    - their names start with `_` (works also for PHP4) 
    

关于_output功能,它是公共的,但它可以,因为它包含_不得直接调用。

为什么公开?

该功能被系统调用,因此它需要从类的外部访问,这是不是一个私有函数。但是,它包含_以确保它不通过URL调用。总而言之,如果您的控制器中有不想通过url直接调用的函数,请添加_前缀,或者使用private访问运算符。它们中的任何一个都足够好。仅供参考,其他框架(如Yii或Zend框架)使用前缀action作为可通过URL调用的所有控制器功能(被映射)。

+1

+1比我的更好的解释。 – 2012-04-22 08:42:55

+0

@KemalFadillah谢谢。这是非常友善的:) – 2012-04-22 08:53:03

+3

当您制作自己的核心控制器时,使用'_'是理想的选择,因为您的其他控制器可以扩展以便在控制器之间共享相同的代码。就本质而言,这些函数(在核心控制器中定义的)必须公开才能被继承和可见,但您不希望它们在路由中使用。使用灵活性是我喜欢CI的一个方面。 – 2012-04-22 08:59:26

4

尽管用户指南确实要求您在控制器内使用下划线将专用功能的函数名称作为前缀的前缀,但这并不是强制性的。尽管遵循约定可能是一个好主意,但建议您这样做。

如果访问修饰符是public,则可以看到以下划线为函数名称加前缀时的显着效果。在这种情况下,如果您尝试通过URL访问该功能,将会给您一个404错误。但在这种情况下,您将访问修饰符设置为private,是否在函数名称前加下划线并不重要。

但在本教程中,请查看添加注销部分。其中有一个私有函数:private function check_isvalidated()。这里的 没有以字符_作为前缀。

该教程中,函数名不以下划线前缀,但它是一个私有函数,因为它被声明为一个。因此,试图通过URL访问它不起作用。

与此同时,还有一个叫_output():处理 输出。这是一个具有私人 函数的命名约定的公共函数!

我已经解释了这一点,但我想指出_output()函数是在脚本执行过程中在某个特定位置调用的那些特殊函数之一。在这种情况下,CodeIgniter会在函数结束时调用这个函数,正当它是时候向浏览器输出某些东西的时候。

+0

非常感谢。我现在明白了。 :) – 2012-04-22 09:45:50