栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

PHP的Yii框架中YiiBase入口类的扩展写法示例

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHP的Yii框架中YiiBase入口类的扩展写法示例

通过yiic.php自动创建一个应用后,入口文件初始代码如下:

run();


其中第三行引入了一个yii.php的文件,这个可以在yii核心目录里的framework/下找到,这个文件中定义了一个Yii类,并且继承了Yiibase类。

代码如下

require(dirname(__FILE__).'/Yiibase.php');
 

class Yii extends Yiibase
{
}

Yii::createWebApplication

这个方法实际上是在Yiibase父类中定义的,所以,Yii为我们预留了扩展的可能。我们只需要在yii.php中添加我们想要扩展的方法即可,在项目中直接使用 Yii::方法名() 调用。
为了将项目代码和核心目录完全分离,我个人觉得在项目目录下使用另外一个yii.php来替代从核心目录中包含yii.php更加好。

这里我用了更加极端的方法,我直接将yii这个类定义在了入口文件,并扩展了一个全局工厂函数 instance()方法,请看代码:

run();


这个类是在最后一行Yii::createWebApplication()之前定义的,以保证Yii类能正常使用(不要把这个类放在文件末尾,会出错。)

在项目中任何地方,使用$obj = Yii::instance($alias);去实例化一个类,并且是单例模式。

Yiibase中的两个比较重要的方法 (import,autoload)
然后看看Yiibase中的import方法就知道这些静态变量是干嘛用的了:

 
 public static function import($alias, $forceInclude = false){  
 //Yii把所有的依赖放入到这个全局的$_imports数组中,名字不能重复
 //如果当前依赖已经被引入过了,那么直接返回
 if (isset(self::$_imports[$alias])) {    
    return self::$_imports[$alias];  
  }  
 //class_exists和interface_exists方法的第二个参数的值为false表示不autoload 
 if (class_exists($alias, false) || interface_exists($alias, false)) {    
   return self::$_imports[$alias] = $alias;  
 }  
 //如果传进来的是一个php5.3版本的命名空间格式的类(例如:abc.php)
 if (($pos = strrpos($alias, '\')) !== false) {    
  //$namespace = a.b
  $namespace = str_replace('\', '.', ltrim(substr($alias, 0, $pos), '\')); 
  //判断a.b这个路径是否存在,或者a.b只是alias里面的一个键,调用该方法返回这个键对应的值,比如'email' => realpath(__DIR__ . '/../vendor/cornernote/yii-email-module/email')
  if (($path = self::getPathOfAlias($namespace)) !== false) {   
    $classFile = $path . DIRECTORY_SEPARATOR . substr($alias, $pos + 1) . '.php';
    if ($forceInclude) { 
     if (is_file($classFile)) {   
require($classFile); 
      } else {   
      throw new CException(Yii::t('yii', 'Alias "{alias}" is invalid. Make sure it points to an existing PHP file and the file is readable.', array('{alias}' => $alias))); 
     } 
     self::$_imports[$alias] = $alias;      
     } else { 
     self::$classMap[$alias] = $classFile;      
    }      
    return $alias;    
  } else {      
// try to autoload the class with an autoloader      
  if (class_exists($alias, true)) { 
    return self::$_imports[$alias] = $alias;      
  } else { 
    throw new CException(Yii::t('yii', 'Alias "{alias}" is invalid. Make sure it points to an existing directory or file.',   array('{alias}' => $namespace)));      
  }    
  }  
 }  
if (($pos = strrpos($alias, '.')) === false) // a simple class name 
 {    
  // try to autoload the class with an autoloader if $forceInclude is true    
  if ($forceInclude && (Yii::autoload($alias, true) || class_exists($alias, true))) {      
   self::$_imports[$alias] = $alias;    
   }    
  return $alias;  
 }  
 $className = (string)substr($alias, $pos + 1);  

 $isClass = $className !== '*';  
 if ($isClass && (class_exists($className, false) || interface_exists($className, false))) {    
  return self::$_imports[$alias] = $className;  
 }  
 if (($path = self::getPathOfAlias($alias)) !== false) {    
   if ($isClass) {      
      if ($forceInclude) { 
  if (is_file($path . '.php')) {   
      require($path . '.php'); 
  } else {   
      throw new CException(Yii::t('yii', 'Alias "{alias}" is invalid. Make sure it points to an existing PHP file and the file is readable.', array('{alias}' => $alias))); 
      } 
 self::$_imports[$alias] = $className;      
     } else { 
 self::$classMap[$className] = $path . '.php';      
     }      
      return $className;    
    } 
    // $alias是'system.web.*'这样的已*结尾的路径,将路径加到include_path中
    else // a directory    
     {      
if (self::$_includePaths === null) {    
   self::$_includePaths = array_unique(explode(PATH_SEPARATOR, get_include_path()));  
    if (($pos = array_search('.', self::$_includePaths, true)) !== false) {   
 unset(self::$_includePaths[$pos]); 
      }      
    }      
    array_unshift(self::$_includePaths, $path);      
    if (self::$enableIncludePath && set_include_path('.' . PATH_SEPARATOR . implode(PATH_SEPARATOR, self::$_includePaths)) === false) { 
     self::$enableIncludePath = false;      
     }      
     return self::$_imports[$alias] = $path;    
    }  
  } else {    
    throw new CException(Yii::t('yii', 'Alias "{alias}" is invalid. Make sure it points to an existing directory or file.',      array('{alias}' => $alias)));  
    }
 }

是的,上面这个方法最后就把要加载的东西都放到$_imports,$_includePaths中去了。这就是Yii的import方法,好的,接下来我们看看autoload方法:

public static function autoload($className, $classMaponly = false){  // use include so that the error PHP file may appear  
if (isset(self::$classMap[$className])) {
  include(self::$classMap[$className]);  
} elseif (isset(self::$_coreClasses[$className])) {    
  include(YII_PATH . self::$_coreClasses[$className]);  
} elseif ($classMapOnly) {    
  return false;  
} else {    
 // include class file relying on include_path    
    if (strpos($className, '\') === false) 
    // class without namespace    
    {      
      if (self::$enableIncludePath === false) { 
  foreach (self::$_includePaths as $path) {
     $classFile = $path . DIRECTORY_SEPARATOR . $className . '.php';   
     if (is_file($classFile)) {
 include($classFile);     
if (YII_DEBUG && basename(realpath($classFile)) !== $className . '.php') {
  throw new CException(Yii::t('yii', 'Class name "{class}" does not match class file "{file}".', array(  '{class}' => $className,  '{file}' => $classFile,)));     
}     
break;   
    } 
}      
   } else { 
      include($className . '.php');      
}    
 } else // class name with namespace in PHP 5.3    
   {      
     $namespace = str_replace('\', '.', ltrim($className, '\'));    
     if (($path = self::getPathOfAlias($namespace)) !== false) {  
      include($path . '.php');      
     } else { 
      return false;      
     }    
   }    

   return class_exists($className, false) || interface_exists($className, false);    }    return true;}
config文件中的 import 项里的类或路径在脚本启动中会被自动导入。用户应用里个别类需要引入的类可以在类定义前加入 Yii::import() 语句。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/43734.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号