CodeIgniter笔记1

olyqcool 2015-02-10

URI路由

一个典型的通配符路由看起来是这样的:

$route['product/(:num)'] = "catalog/product_lookup";

在一个路由中,数组的键包含着被匹配的URI,而数组的值包含着路由将被重定向的目的地.在上面的例子中,如果单词“product”出现在URL的第一个部分中,而且数字(:num)出现在URI的第二个部分中,"catalog"类和"product_lookup"方法将被替代使用(即将被重定向).

你可以匹配文字的值或者使用以下两种通配符类型:

:num 将匹配一个只包含有数字的segment(段).
:any 将匹配一个包含任何字符的segment.

注意: 路由将会按照定义的顺序来运行.高层的路由总是优先于低层的路由.

删除 index.php 文件

默认情况下,index.php 文件将被包含在你的 URL 中:

example.com/index.php/news/article/my_article

你可以很容易的通过 .htaccess 文件来设置一些简单的规则删除它。下面是一个例子,使用“negative”方法将非指定内容进行重定向:

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

如果你的项目不在根目录请把上面这一句改为:RewriteRule ^(.*)$ index.php/$1 [L]

在上面的例子中,可以实现任何非 index.php、images 和 robots.txt 的 HTTP 请求都被指向 index.php。

创建你自己的类库

文件名首字母大写. 例如: Myclass.php

类声明首字母大写. 例如: class Myclass

类的名字和文件名应符合.

在所有的Controller 函数中,你可以用以下的标准方式初始化你的类:

$this->load->library('myclass');

当 someclass 是文件名时,不用加上".php"扩展名.这里名字不分大小写.

一旦你自定义的类加载完毕,你可以通过以下方式调用类,注意使用 小写 的名字:

$this->myclass->some_function(); // 对象的实例名永远都是小写的

调试你的应用程序

该分析器将在页面下方显示基准测试结果,运行过的 SQL 语句,以及 $_POST 数据。这些信息有助于开发过程中的调试和优化。

初始化类

注意: 此分析器无须手动初始化.如果已按照下面的方式激活,他将被输出类自动装载。

激活分析器

控制器中设置以下方法以激活该分析器

$this->output->enable_profiler(TRUE);

分析器激活后将产生一个报告并插入您的页面底部,使用以下方法禁用该分析器:

$this->output->enable_profiler(FALSE);

辅助函数

载入辅助函数是非常简单的:

$this->load->helper('name');

name 是辅助函数文件的名字(不带.php后缀 和"helper" 部分)。

例如,要载入文件名为url_helper.php的URL Helper,你将会用到下面的语句:

$this->load->helper('url');

辅助函数可以在你的控制器(controller)的任何地方被载入,甚至可以在视图(View)文件中被载入(我们并不建议你这么做)。请在使用辅助函数之前载入他们。你可以在你的控制器构造函数中载入它们,以便辅助函数能自动在其他函数之前被载入。你也可以在要用到辅助函数的地方当场载入。

载入多个辅助函数

如果你想一次载入多个辅助函数,你可以这样做:

$this->load->helper( array('helper1', 'helper2', 'helper3') );

自动载入辅助函数

如果你想要的话,CodeIgniter可以自动为你载入辅助函数。你可以通过打开 application/config/autoload.php ,并往自动载入数组(autoload array)中增加辅助函数来实现。

管理你的应用程序

更改你的应用程序的文件夹路径

你可以将 application文件夹从system 文件夹中挪放到服务器的其他的位置。但是你还要更改 index.php 文件里将$application_folder变量设置为服务器的全路径。

$application_folder = "/Path/to/your/application";

在一个 CodeIgniter 下运行多个应用程序

如果你想要多个应用程序共享同一个 CodeIgniter, 你要将 application 下所有的文件夹放在不同的应用程序的文件夹内。

例如,你要建立两个应用程序 "foo" 和 "bar",你的应用程序文件夹的结构可能会像下面的这样:

applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/errors/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/
applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/errors/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/

要选择使用某个应用程序,你需要打开主 index.php 文件,并且设置 $application_folder 变量为目标路径。例如,通过如下设置,就可以选择使用 "foo" 应用程序:

$application_folder = "applications/foo";

开发规范

PHP 闭合标签

PHP闭合标签“?>”在PHP中对PHP的分析器是可选的。 但是,如果使用闭合标签,任何由开发者,用户,或者FTP应用程序插入闭合标签后面的空格都有可能会引起多余的输出、php错误、之后的输出无法显示、空白页。因此,所有的php文件应该省略这个php闭合标签,并插入一段注释来标明这是文件的底部并定位这个文件在这个应用的相对路径。这样有利于你确定这个文件已经结束而不是被删节的。

INCORRECT: <?php echo "Here's my code!"; ?>

 CORRECT:   <?php echo "Here's my code!"; 

/* End of file myfile.php */ 

/* Location: ./system/modules/mymodule/myfile.php */

类和方法(函数)的命名规则

类名的首字母应该大写。如果名称由多个词组成,词之间要用下划线分隔,不要使用骆驼命名法。类中所有其他方法的名称应该完全小写并且名称能明确指明这个函数的用途,最好用动词开头。尽量避免过长和冗余的名称

不当的:  class superclass , class SuperClass 

适当的:  class Super_class

不当的和适当的方法名称的示例:

不当的:

function fileproperties() // 方法名没有清晰的描述以及下划线分割单词

function fileProperties() // 方法名没有清晰的描述以及使用了驼峰法命名function getfileproperties() // 还可以!但是忘记了下划线分割单词

function getFileProperties() // 使用了驼峰法命名

function get_the_file_properties_from_the_file() // 方法名太冗长

适当的:

function get_file_properties() // 清晰的方法名描述,下划线分割单词,全部使用小写字母

变量命名

变量的命名规则与方法的命名规则十分相似。就是说,变量名应该只包含小写字母,用下划线分隔,并且能适当地指明变量的用途和内容。那些短的、无意义的变量名应该只作为迭代器用在for()循环里。

常量

常量命名除了要全部用大写外,其他的规则都和变量相同。在适当的时候,始终使用CodeIgniter常量,例如MY_NAME , LASH, LD, RD, PATH_CACHE等等.

比较返回值与类型映射

不当的:

if (strpos($str, 'foo') == FALSE) // 如果 'foo' 位于此字符串的起始处,strpos将返回 0,// 此处条件判断的结果为TRUE

恰当的:

if (strpos($str, 'foo') === FALSE)

数据库表名

你的附加组件所用到的任何表都必须使用 'exp_' 这个前缀,然后是一个能够唯一标识开发者或公司的前缀,最后才是一个简短的描述性的表名。你不需要担心用户安装时所使用的数据库前缀,因为CodeIgniter的数据库类将根据实际情况自动地对 'exp_' 进行转换。

不当的: 

email_addresses // 缺少这两个前缀

pre_email_addresses // 缺少 exp_ 前缀 

exp_email_addresses // 缺少唯一前缀 

恰当的: 

exp_pre_email_addresses

代码缩进

使用 Allman 风格缩进。除了类声明以外,括号总是独占一行,且缩进与“属于”它的控制语句同级。

恰当的: 

function foo($bar) 

// ... 

if ($foo == $bar)

 { 

// ... 

else {

// ... 

私有方法和变量

如果方法和变量只在类的内部使用,应当使用下划线作为前缀。

convert_text() // public method 

_convert_text() // private method

字符串

一直使用单引号除非你需要解析变量,如果需要解析变量请使用大括号, to prevent greedy token parsing. 如果字符串包含单引号的话你可以使用双引号,这样就不用转义了。

INCORRECT:

 "My String" // 没有解析变量,不需要使用双引号 

 "My string $foo" // 解析变量需要使用括号 

 'SELECT foo FROM bar WHERE baz = \'bag\'' // 需要转义单引号''时这样写比较难看,可以使用双引号 

CORRECT: 

'My String' 

"My string {$foo}"

"SELECT foo FROM bar WHERE baz = 'bag'"

SQL 查询

MySQL 的关键字一直大写: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN等等考虑到易读性,请将从句句分成多行来写。

CORRECT:

 $query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz

 FROM exp_pre_email_addresses

 WHERE foo != 'oof' AND baz != 'zab' 

 ORDER BY foobaz 

 LIMIT 5, 100");

控制器

将 URI 片段传递给方法

如果你的 URI 超过两个部分,那么超过的将被作为参数传递给方法。举例来说,如果你的 URI 是这样的:

example.com/index.php/products/shoes/sandals/123 ,URI 的第3和第4部分会被传递给你的方法(“arg1” 和 “arg2”):

上面的方法调用时必须给两个相应的参数,要不然会出错。当然你也可以像下面这样写,就不用在调用的时候给参数了!

 function shoes($arg1='Test', $arg2=1)
 {
 echo $arg1;//sandals
 echo $arg2; //123

 }

重新定义方法的调用规则

被重新定义的方法调用方式(一般是 URI 中的第二片段)将作为一个参数传递给 _remap():

public function _remap($method)
{
 if ($method == 'some_method')
 {
$this->$method();
 }
 else
  {
  $this->comments();
  }
}

模型

模型可以在 controller 中被引用。就像这样:

$this->load->model('Model_name');
$this->Model_name->function();

在默认的情况下模型名称就直接被引入作为对象名,就如上面所示。当然,如果你愿意,可以起个更好记的对象名!那么,可以在加载模型函数中指定第二个参数来设定,例如:

$this->load->model('Model_name', 'fubar');
$this->fubar->function();

视图

获取视图内容

view函数第三个可选参数可以改变函数的行为,让数据作为字符串返回而不是发送到浏览器。如果想用其它方式对数据进一步处理,这样做很有用。如果将view第三个参数设置为true(布尔)则函数返回数据。view函数缺省行为是 false, 将数据发送到浏览器。如果想返回数据,记得将它赋到一个变量中:

$string = $this->load->view('myfile', '', true);

网页缓存

启用缓存功能,只需要将下面的代码放入你的任何一个控制器(controller)的方法(function)内: $this->output->cache(n);

其中 n 是你希望缓存更新的 分钟 数。可以使用 m/60 来精确到秒,例如 1/60 ,则是精确到 1秒。

警告:由于CI存储缓存文件的方式,只有通过 view 文件的输出才能被缓存。

相关推荐