WEB程序入口,php自动加载的二种完结格局编程:

By admin in 编程 on 2019年7月23日

先是种格局 安分守纪YII系统的方法生成视图以为有个别费力,以为用smarty更便捷。尝试着把smarty模板加进去了。

php自动载方法有三种.
率先种方案用__autoload,这么些函数较简单,也较弱.
但有一主题材料未有缓慢解决, 就是在include前剖断文件是或不是存在的难点.

来至:

复制代码 代码如下:

复制代码 代码如下:

以下分析基于Yii v1.0.6

date_default_timezone_set(“PRC”);
class PlaceController extends CController {
protected $_smarty;
function __construct(){
parent::__construct(‘place’);//需求多个参数来调用父类的构造函数,该参数为调整器ID
$path =
Yii::getPathOf阿里as(‘application’);//得到protected文件夹的相对路径
include
(dirname($path).DIRECTORY_SEPARATOR.’Smarty’.DIRECTORY_SEPARATO途锐.’斯玛特y.class.php’);//smarty所在门路
$this->_smarty = new Smarty();
$this->_smarty->template_dir =
dirname($path).DIRECTORY_SEPARATOR.’template’.DIRECTORY_SEPARATO福睿斯;//模板路线
}

set_include_path(‘aa’ . PATH_SEPARATOR . get_include_path());
function __autoload($className)
{
//假使加这么些检验, 因为此文件不在当前目录下,它就能够检验不到文件存在,
//但include是能得逞的
if (file_exists($className . ‘.php’)) {
  include_once($className . ‘.php’);
} else {
exit(‘no file’);
}
}
$a = new Acls();

 

重点叁个标题是自动加载类实践争持的主题材料
YII注册了三个电动加载类spl_autoload_register(array(‘YiiBase’,’autoload’)),SMARTY也注册了三个自行加载类,spl_autoload_register(‘smartyAutoload’),YII
注册在前,那样在境遇三个类名的时候,先进行的是YII的自定义自动加载类的函数,对应SMARTY里的每一个类名来说,也是先调用YII的自动加载类的函
数,不过若是不符合YII自动加载的尺度的话,就能够实行SMARTY的机动加载类的函数,可是,SMARTY的类名在自动加载类的时候,确符合了YII自
动加载类的逻辑语句,结果即是YII使用Include语句要包罗的类分明找不到。
化解的方法是:当SMARTY的类活动加载的时候,跳出在YII定义的活动加载函数,那样就会实行SMARTY的加载函数。
切实落到实处是,修改YIIBase类里面包车型地铁autoload函数,增添如下代码

其次种方案用spl自动加载,这里具体说一下这么些.
spl_autoload_register()
一个简便的例证

Yii_PATH表示framework的路径

复制代码 代码如下:

复制代码 代码如下:

 

public static function autoload($className)
{
// use include so that the error PHP file may appear
if(preg_match(‘/smarty/i’, $className)){     
//只要类名包罗smarty的,无论大小写,都回来,那样就跳出了YII自动加载类而去实行                                                                                 
SMARTY的活动加载类函数了
return;
}
             YII自动加载类代码
}

set_include_path(‘aa’ . PATH_SEPARATOR . get_include_path());
//function __autoload($className)
//{
// if (file_exists($className . ‘.php’)) {
// include_once($className . ‘.php’);
// } else {
// exit(‘no file’);
// }
//}
spl_autoload_register();
$a = new Acls();

日常使用Yii框架的index.php程序如下:

那样就足以在每种Action里应用smarty模板了。

spl_autoload_register()会活动先调用spl_autoload()在渠道中搜求具有小写文件名的”.php”程序.默许查找的恢宏名还会有”.ini”,还足以用spl_autoload_extenstions()注册扩展名.
在找不到的清况下,仍是能够透过和谐定义函数查找

function loader1($class)
{
//自个儿写一些加载的代码
}
function loader2($class)
{
//当loader1()找不到时,笔者来找
}
spl_autoload_register(‘loader1’);
spl_autoload_register(‘loader2’);
还足以越多……..
MVC框架是怎样完结自动加载的
率先设置路线
‘include’ => array( ‘application/catalog/controllers’,
‘application/catalog/models’, ),$include =
array(‘application/controllers’, ‘application/models’,
‘application/library’);
set_include_path(get_include_path() . PATH_SEPARATOR
.implode(PATH_SEPARATOR, $config[‘include’]));
在赢得U瑞虎L,深入分析出调节器与方法.
下一场设置自动加载

Php代码  编程 1

复制代码 代码如下:

复制代码 代码如下:

  1. // change the following paths if necessary  
  2. $yii    = dirname(__FILE__).’/protected/lib/Yii/framework/yii.php’;  
  3. $config = dirname(__FILE__).’/protected/config/main.php’;  
  4.   
  5. // remove the following line when in production mode  
  6. defined(‘YII_DEBUG’) or define(‘YII_DEBUG’,true);  
  7.   
  8. require_once $yii;  
  9. $app = Yii::CreateWebApplication($config);  
  10. $app->run();  

public function actionIndex(){
$this->_smarty->assign(‘test’, ‘测试’);
$this->_smarty->display(‘create.html’);
}

class Loader
{
/**
* 自动加载类
* @param $class 类名
*/
public static function autoload($class)
{
$path = ”;
$path = str_replace(‘_’, ‘/’, $class) . ‘.php’;
include_once($path);
}
}
/**
* sql自动加载
*/
spl_autoload_register(array(‘Loader’, ‘autoload’));

 

第二种艺术: 在protected下的extensions文件夹归入smarty模板插件,并树立C斯Matty类文件,内容如下

路由,实例化调控器,调用方法,你写的事物就起来执行了

大家来看一下Yii::CreateWebApplication的进程:

复制代码 代码如下:

复制代码 代码如下:

 

<?php
require_once(Yii::getPathOfAlias(‘application.extensions.smarty’).DIRECTORY_SEPARATOR.’Smarty.class.php’); 
    define(‘SMARTY_VIEW_DIR’,
Yii::getPathOfAlias(‘application.views’)); 

/**
* 路由
*/
public function route()
{
if (class_exists($this->getController())) {
$rc = new ReflectionClass($this->getController());
if ($rc->hasMethod($this->getAction())) {
$controller = $rc->newInstance();
$method = $rc->getMethod($this->getAction());
$method->invoke($controller);
} else
throw new Exception(‘no action’);
} else
throw new Exception(‘no controller’);
}

Yii其实是YiiBase的helper,因此大家实际上查看的是YiiBase::CreateWebApplication

    class CSmarty extends Smarty { 
        const DIR_SEP = DIRECTORY_SEPARATOR; 
        function __construct() { 
            parent::__construct(); 

初叶的全自动加载就产生了

 

            $this->template_dir = SMARTY_VIEW_DIR; 
            $this->compile_dir =
SMARTY_VIEW_DIR.self::DIR_SEP.’template_c’; 
            $this->caching = true; 
            $this->cache_dir =
SMARTY_VIEW_DIR.self::DIR_SEP.’cache’; 
            $this->left_delimiter  =  ‘<!–{‘; 
            $this->right_delimiter =  ‘}–>’; 
            $this->cache_lifetime = 3600; 
        } 
        function init() {} 
    } 
    ?>

你恐怕感兴趣的篇章:

  • PHP
    自动加载的简单达成(推荐)
  • PHP网址自动化配置的落到实处格局(不可不看)

Yii_PATH/YiiBase.php:

下一场建立samrty所需的template_c,cache等文件夹。
接下去是布局地分
开荒protected/config/main.php在components数组中参与

 

复制代码 代码如下:

Php代码  编程 2

‘smarty’=>array(
    ‘class’=>’application.extensions.CSmarty’,
),

  1. class YiiBase  
  2. {  
  3. ……  
  4.     public static function createWebApplication($config=null)  
  5.     {  
  6.         return new CWebApplication($config);  
  7.     }  
  8. ……  
  9.     //自动类加载函数  
  10.     public static function autoload($className)  
  11.     {  
  12.   
  13.         // use include so that the error PHP file may appear  
  14.         if(isset(self::$_coreClasses[$className]))  
  15.             include(YII_PATH.self::$_coreClasses[$className]);  
  16.         else if(isset(self::$_classes[$className]))  
  17.             include(self::$_classes[$className]);  
  18.         else  
  19.         {  
  20.             include($className.’.php’);  
  21.             return class_exists($className,false) || interface_exists($className,false);  
  22.         }  
  23.         return true;  
  24.     }  
  25. ……  
  26.   
  27.     //宗旨类列表  
  28.     private static $_coreClasses=array(  
  29.         ‘CApplication’ => ‘/base/CApplication.php’,  
  30.         ‘CApplicationComponent’ => ‘/base/CApplicationComponent.php’,  
  31.         ‘CBehavior’ => ‘/base/CBehavior.php’,  
  32.         ……  
  33.     );  
  34.   
  35. }  
  36. //注册自动类加载函数  
  37. spl_autoload_register(array(‘YiiBase’,’autoload’));  
  38. require(YII_PATH.’/base/interfaces.php’);  

最终在action中央机关单位接用Yii::app()->smarty就足以试用smarty了。假如老是在action中动用Yii::app()->smarty比较劳累的话,能够在components下的Controller中得以参与

 

复制代码 代码如下:

此地再次回到的是三个CWebApplication的指标,

protected $smarty = ”;
protected function init() {
       $this->smarty = Yii::app()->smarty;
 }

 

下一场在action中就直接能够用$this->smarty使用smarty了。

Yii_PATH/web/CWebApplication.php

你只怕感兴趣的篇章:

  • Yii的CDbCriteria查询条件用法实例
  • Yii使用find
    findAll查寻觅内定字段的完毕情势
  • Yii操作数据库的3种艺术
  • Yii框架中 find findAll
    查找寻制订的字段的章程比较
  • Yii调节和测量检验SQL的常用方法
  • Yii2创立表单(ActiveForm)方法详解
  • Yii实现多数据库主从读写分离的办法
  • Yii2隐藏frontend/web和backend/web的方法
  • Yii中Model(模型)的创始及运用情势
  • Yii使用ajax验证展现错误messagebox的缓慢解决办法
  • PHP的Yii框架中创造视图和渲染视图的形式详解
  • yii实现model增加私下认可值的办法(2种情势)
  • Yii
    CDBCriteria常用方法实例小结

Java代码  编程 3

  1. class CWebApplication extends CApplication  
  2. {  
  3. ……  
  4. }  

 CWebApplication承袭自CApplication,未有自定义的constructor,由此我们接二连三翻看CApplication的constructor:

 

Yii_PATH/base/CApplication.php

 

Php代码  编程 4

  1. abstract class CApplication extends CModule  
  2. {  
  3. ……  
  4.     public function __construct($config=null)  
  5.     {  
  6.         Yii::setApplication($this);  
  7.         // set basePath at early as possible to avoid trouble  
  8.         if(is_string($config))  
  9.             $config=require($config);  
  10.         if(isset($config[‘basePath’]))  
  11.         {  
  12.             $this->setBasePath($config[‘basePath’]);  
  13.             unset($config[‘basePath’]);  
  14.         }  
  15.         else  
  16.             $this->setBasePath(‘protected’);  
  17.         Yii::setPathOfAlias(‘application’,$this->getBasePath());  
  18.         Yii::setPathOfAlias(‘webroot’,dirname($_SERVER[‘SCRIPT_FILENAME’]));  
  19.   
  20.         $this->preinit();  
  21.   
  22.         $this->initSystemHandlers();  
  23.         $this->registerCoreComponents();  
  24.   
  25.         $this->configure($config);  
  26.         $this->attachBehaviors($this->behaviors);  
  27.         $this->preloadComponents();  
  28.   
  29.         $this->init();  
  30.     }  
  31. ……  
  32. }  

 这里,做了大多做事,我们来渐渐分析:

 

Php代码  编程 5

  1. Yii::setApplication($this);  

 对应代码如下:

Php代码  编程 6

  1. public static function setApplication($app)  
  2. {  
  3.     if(self::$_app===null || $app===null)  
  4.         self::$_app=$app;  
  5.     else  
  6.         throw new CException(Yii::t(‘yii’,’Yii application can only be created once.’));  
  7. }  

 这里只是set一下application的名目,ok,继续:

Php代码  编程 7

  1. if(is_string($config))  
  2.     $config=require($config);  
  3. if(isset($config[‘basePath’]))  
  4. {  
  5.     $this->setBasePath($config[‘basePath’]);  
  6.     unset($config[‘basePath’]);  
  7. }  
  8. else  
  9.     $this->setBasePath(‘protected’);  

 这里根本是将createWebApplication时穿过来的安顿文件require了弹指间,然后得到安顿项中的basePath,设置成员变量:

Php代码  编程 8

  1. public function setBasePath($path)  
  2. {  
  3.     if(($this->_basePath=realpath($path))===false || !is_dir($this->_basePath))  
  4.         throw new CException(Yii::t(‘yii’,’Application base path “{path}” is not a valid directory.’,  
  5.             array(‘{path}’=>$path)));  
  6. }  

 之后:

Php代码  编程 9

  1. Yii::setPathOfAlias(‘application’,$this->getBasePath());  
  2. Yii::setPathOfAlias(‘webroot’,dirname($_SERVER[‘SCRIPT_FILENAME’]));  

 通过上面包车型客车函数设置路线的小名:

Php代码  编程 10

  1. public static function setPathOfAlias($alias,$path)  
  2. {  
  3.     if(emptyempty($path))  
  4.         unset(self::$_aliases[$alias]);  
  5.     else  
  6.         self::$_aliases[$alias]=rtrim($path,’\\/’);  
  7. }  

 保存在$_aliases数组中,接下去是有个别初步化的做事(未完待续):

Php代码  编程 11

  1. $this->preinit();  

 调用的是Yii_PATH/base/CModule.php中的三个空函数,用于开头化模块(子类覆盖)

Php代码  编程 12

  1. protected function preinit(){  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有