当前位置: 编程技术>php
本页文章导读:
▪yii框架源码分析之创建controller代码
使用yii框架的url路径一般形如hostname/?r=xxxx/xxxx/xxxx&sdfs=dsfdsf 我们可以看到有时会使用protected目录下的controller,有时会使用module中controller,具体是如何处理的呢,请看如下的分析: 以下.........
▪关于PHP中Object对象的笔记分享
1.当将所有实例设为null,php会自动清除对象的引用。 2.建构子:__construct() 清除对象时自动执行的方法:__destruct() 也可以设置手动清除对象的方法:destroy或者clean_up 3.对象中的三种变量范围.........
▪php dirname(__FILE__) 获取当前文件的绝对路径
比如当前文件是放在(d:\www\)下,文件名是test.php。 测试的代码如下: 代码如下: <?php echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\www\test.php echo dirname(__FILE__); // 取得当前文件所在的.........
[1]yii框架源码分析之创建controller代码
来源: 互联网 发布时间: 2013-11-30
使用yii框架的url路径一般形如hostname/?r=xxxx/xxxx/xxxx&sdfs=dsfdsf
我们可以看到有时会使用protected目录下的controller,有时会使用module中controller,具体是如何处理的呢,请看如下的分析:
以下代码摘自yii框架核心代码%Yiiroot%/framework/web/CWebApplication.php
=================================================================================================
//1.runController是执行一个controller的方法,$route是$_GET['r']
public function runController($route)
{
//在这里调用createController先去创建一个controller实例,由此可见createController是选择controller的关键
if(($ca=$this->createController($route))!==null)
{
list($controller,$actionID)=$ca;
$oldController=$this->_controller;
$this->_controller=$controller;
$controller->init();
$controller->run($actionID);
$this->_controller=$oldController;
}
else
throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
array('{route}'=>$route===''?$this->defaultController:$route)));
}
==================================================================================================
//2.接下来我们分析createController,假设我们访问的route是site/contact
public function createController($route,$owner=null)
{
//首次进入这个函数,$owner参数为空
if($owner===null)
$owner=$this;
//如果$route参数中不含/,那么使用默认的controller
if(($route=trim($route,'/'))==='')
$route=$owner->defaultController;
$caseSensitive=$this->getUrlManager()->caseSensitive;
//为了能够完整运行下面的循环,给$route后面加一个/
$route.='/';
//将/的位置保存在$pos中
while(($pos=strpos($route,'/'))!==false)
{
//$id是前半部分,即site
$id=substr($route,0,$pos);
if(!preg_match('/^\w+$/',$id))
return null;
if(!$caseSensitive)
$id=strtolower($id);
//$route变成后半部分,即contact
$route=(string)substr($route,$pos+1);
//controller根目录或子目录前缀
if(!isset($basePath)) // first segment
{
//首次进入,$owner为空,没有这个成员变量
//非首次进入或$owner有值,有可能设置了这个成员变量,参见CWebModule类
if(isset($owner->controllerMap[$id]))
{
return array(
Yii::createComponent($owner->controllerMap[$id],$id,$owner===$this?null:$owner),
$this->parseActionParams($route),
);
}
//如果能通过getModule方法获取到一个独立模块,则再次调用createController,适用于site是module名的情况,参考protected/config/main.php配置文件,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
if(($module=$owner->getModule($id))!==null)
return $this->createController($route,$module);
//controller的目录:
//对于CWebApplication,对应config['basePath'](参见配置文件)./controller/,例如你的controller在%webroot%/protected/controller/SiteController.php
//对于CModule的子类,对应改子类所在文件夹./contoller/,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
$basePath=$owner->getControllerPath();
$controllerID='';
}
else
$controllerID.='/';
$className=ucfirst($id).'Controller';
$classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
//如果$classFile存在,根据上面所得到的controller类文件路径,创建类实例
//如果不存在,则是子目录下的controller,继续循环寻找最终的controller,例如你的controller在%webroot%/protected/controller/somedir/SiteController
if(is_file($classFile))
{
if(!class_exists($className,false))
require($classFile);
if(class_exists($className,false) && is_subclass_of($className,'CController'))
{
$id[0]=strtolower($id[0]);
return array(
new $className($controllerID.$id,$owner===$this?null:$owner),
$this->parseActionParams($route),
);
}
return null;
}
$controllerID.=$id;
$basePath.=DIRECTORY_SEPARATOR.$id;
}
}
我们可以看到有时会使用protected目录下的controller,有时会使用module中controller,具体是如何处理的呢,请看如下的分析:
以下代码摘自yii框架核心代码%Yiiroot%/framework/web/CWebApplication.php
代码如下:
=================================================================================================
//1.runController是执行一个controller的方法,$route是$_GET['r']
public function runController($route)
{
//在这里调用createController先去创建一个controller实例,由此可见createController是选择controller的关键
if(($ca=$this->createController($route))!==null)
{
list($controller,$actionID)=$ca;
$oldController=$this->_controller;
$this->_controller=$controller;
$controller->init();
$controller->run($actionID);
$this->_controller=$oldController;
}
else
throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
array('{route}'=>$route===''?$this->defaultController:$route)));
}
==================================================================================================
//2.接下来我们分析createController,假设我们访问的route是site/contact
public function createController($route,$owner=null)
{
//首次进入这个函数,$owner参数为空
if($owner===null)
$owner=$this;
//如果$route参数中不含/,那么使用默认的controller
if(($route=trim($route,'/'))==='')
$route=$owner->defaultController;
$caseSensitive=$this->getUrlManager()->caseSensitive;
//为了能够完整运行下面的循环,给$route后面加一个/
$route.='/';
//将/的位置保存在$pos中
while(($pos=strpos($route,'/'))!==false)
{
//$id是前半部分,即site
$id=substr($route,0,$pos);
if(!preg_match('/^\w+$/',$id))
return null;
if(!$caseSensitive)
$id=strtolower($id);
//$route变成后半部分,即contact
$route=(string)substr($route,$pos+1);
//controller根目录或子目录前缀
if(!isset($basePath)) // first segment
{
//首次进入,$owner为空,没有这个成员变量
//非首次进入或$owner有值,有可能设置了这个成员变量,参见CWebModule类
if(isset($owner->controllerMap[$id]))
{
return array(
Yii::createComponent($owner->controllerMap[$id],$id,$owner===$this?null:$owner),
$this->parseActionParams($route),
);
}
//如果能通过getModule方法获取到一个独立模块,则再次调用createController,适用于site是module名的情况,参考protected/config/main.php配置文件,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
if(($module=$owner->getModule($id))!==null)
return $this->createController($route,$module);
//controller的目录:
//对于CWebApplication,对应config['basePath'](参见配置文件)./controller/,例如你的controller在%webroot%/protected/controller/SiteController.php
//对于CModule的子类,对应改子类所在文件夹./contoller/,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
$basePath=$owner->getControllerPath();
$controllerID='';
}
else
$controllerID.='/';
$className=ucfirst($id).'Controller';
$classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
//如果$classFile存在,根据上面所得到的controller类文件路径,创建类实例
//如果不存在,则是子目录下的controller,继续循环寻找最终的controller,例如你的controller在%webroot%/protected/controller/somedir/SiteController
if(is_file($classFile))
{
if(!class_exists($className,false))
require($classFile);
if(class_exists($className,false) && is_subclass_of($className,'CController'))
{
$id[0]=strtolower($id[0]);
return array(
new $className($controllerID.$id,$owner===$this?null:$owner),
$this->parseActionParams($route),
);
}
return null;
}
$controllerID.=$id;
$basePath.=DIRECTORY_SEPARATOR.$id;
}
}
[2]关于PHP中Object对象的笔记分享
来源: 互联网 发布时间: 2013-11-30
1.当将所有实例设为null,php会自动清除对象的引用。
2.建构子:__construct()
清除对象时自动执行的方法:__destruct()
也可以设置手动清除对象的方法:destroy或者clean_up
3.对象中的三种变量范围:public、private和protected。
4.对象中的常量属性可以使用const关键字,然后在对象外部以“对象名::属性名”的格式引用,在对象内部以“self::属性名”的格式引用。
5.在整个对象所有实例中通用的属性,就是静态属性,使用static关键字。
static与const的区别在于,const前只能使用public关键字,而static可以使用其他关键字。此外,static属性并非只读。
6.在整个对象所有实例中通用的方法,就是静态方法,也使用static关键字。
7.可以定义一个抽象类,用来定义界面。这种类只能被继承,而不能创造实例。在类内部,用abstract定义子类必须提供的方法。
凡是有abstract方法的类,必须在类名前使用abstract关键字。
abstract class Producr
8.在方法前加final关键字,可以防止子类override这个方法。
类名之前也可以加final关键字,这样就表明其他类不能继承它。
9.界面interface用来定义一系列抽象类的结构。
interface IProduct
{
... ...
}
abstract class Product implements Iproduct
{
......
}
10.
== 比较两个对象是否为同样类型,以及是否有同样的值。
=== 比较两个对象是否为同一个类的实例。
11.类的克隆:完全复制值。
$a = new SomeClass();
$b = clone $a;
可以定义一个__clone()函数,专门对克隆行为进行定制。
12.可以定义一个类的__toString()方法,对使用print和echo函数的行为进行定制。
13.get_class()函数:返回一个对象的类名。
14.可以在一个函数的参数前加类名,表示TypeHint。
15.可以定义一个__autoload()函数,它的参数就是php找不到定义的类名。可以在这个函数中定义如何自动加载。
2.建构子:__construct()
清除对象时自动执行的方法:__destruct()
也可以设置手动清除对象的方法:destroy或者clean_up
3.对象中的三种变量范围:public、private和protected。
4.对象中的常量属性可以使用const关键字,然后在对象外部以“对象名::属性名”的格式引用,在对象内部以“self::属性名”的格式引用。
5.在整个对象所有实例中通用的属性,就是静态属性,使用static关键字。
static与const的区别在于,const前只能使用public关键字,而static可以使用其他关键字。此外,static属性并非只读。
6.在整个对象所有实例中通用的方法,就是静态方法,也使用static关键字。
7.可以定义一个抽象类,用来定义界面。这种类只能被继承,而不能创造实例。在类内部,用abstract定义子类必须提供的方法。
凡是有abstract方法的类,必须在类名前使用abstract关键字。
abstract class Producr
8.在方法前加final关键字,可以防止子类override这个方法。
类名之前也可以加final关键字,这样就表明其他类不能继承它。
9.界面interface用来定义一系列抽象类的结构。
interface IProduct
{
... ...
}
abstract class Product implements Iproduct
{
......
}
10.
== 比较两个对象是否为同样类型,以及是否有同样的值。
=== 比较两个对象是否为同一个类的实例。
11.类的克隆:完全复制值。
$a = new SomeClass();
$b = clone $a;
可以定义一个__clone()函数,专门对克隆行为进行定制。
12.可以定义一个类的__toString()方法,对使用print和echo函数的行为进行定制。
13.get_class()函数:返回一个对象的类名。
14.可以在一个函数的参数前加类名,表示TypeHint。
15.可以定义一个__autoload()函数,它的参数就是php找不到定义的类名。可以在这个函数中定义如何自动加载。
[3]php dirname(__FILE__) 获取当前文件的绝对路径
来源: 互联网 发布时间: 2013-11-30
比如当前文件是放在(d:\www\)下,文件名是test.php。
测试的代码如下:
<?php
echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\www\test.php
echo dirname(__FILE__); // 取得当前文件所在的绝对目录,结果:D:\www\
echo dirname(dirname(__FILE__)); //取得当前文件的上一层目录名,结果:D:\
?>
使用方法提示,
dirname(__FILE__) 取到的是当前文件的绝对路径,也就是说,比起相对路径,查找速度是最快的。
如果重复一次可以把目录往上提升一个层次:
比如:$d = dirname(dirname(__FILE__));
其实就是把一个目录给dirname()做参数了.因为dirname()返回最后的目录不带\\或者是/
所以重复使用的时候可以认为 dirname() 把最下层的目录当成文件名来处理了.照常返回
当前目录的上级目录.这样重复就得到了它的上一级的目录.
包含得到上一级目录的文件
include(dirname(__FILE__).'/../filename.php');
__FILE__的路径是当前代码所在文件
dirname(dirname(__FILE__));得到的是文件上一层目录名
dirname(__FILE__);得到的是文件所在层目录名
测试的代码如下:
代码如下:
<?php
echo __FILE__ ; // 取得当前文件的绝对地址,结果:D:\www\test.php
echo dirname(__FILE__); // 取得当前文件所在的绝对目录,结果:D:\www\
echo dirname(dirname(__FILE__)); //取得当前文件的上一层目录名,结果:D:\
?>
使用方法提示,
dirname(__FILE__) 取到的是当前文件的绝对路径,也就是说,比起相对路径,查找速度是最快的。
如果重复一次可以把目录往上提升一个层次:
比如:$d = dirname(dirname(__FILE__));
其实就是把一个目录给dirname()做参数了.因为dirname()返回最后的目录不带\\或者是/
所以重复使用的时候可以认为 dirname() 把最下层的目录当成文件名来处理了.照常返回
当前目录的上级目录.这样重复就得到了它的上一级的目录.
包含得到上一级目录的文件
include(dirname(__FILE__).'/../filename.php');
__FILE__的路径是当前代码所在文件
dirname(dirname(__FILE__));得到的是文件上一层目录名
dirname(__FILE__);得到的是文件所在层目录名
最新技术文章: