Das Schlüsselwort „use' in PHP und beim Laden von Dateien

墨辰丷
Freigeben: 2023-03-28 13:26:02
Original
2066 Leute haben es durchsucht

最近有个朋友问我,php中的use关键字是不是会进行文件的自动引入?其实use关键字与文件加载没有一点关系,use关键字的作用就是声明要使用的类所处那个命名空间之下。

前言

可能在大家经常使用框架,写一个Controller或者Model的时候,写了好多use,但是并没有写文件加载的代码,就以为use可以进行文件的自动加载了。

详细介绍

其实,现在流行的php框架,都是基于MVC模式的,大量的使用了命名空间,以提高程序的灵活性。那么框架是怎么实现将use关键字所声明的类库对应的脚本文件进行加载的那?

(1):在通过use关键字进行声明类库的声明的时候,并不会进行脚本的加载,而是在脚本文件真正使用到所对应的类库的时候才会进行加载(这就是所谓延迟加载)。

(2):框架一般在初始化阶段,就声明了__autoload()函数或者是spl_autoload_register()函数(一般会在入口文件中进行声明)。在调用通过use声明的类库的时候,会自动的调用上述的函数,将调用的类库名称传递到函数中(这里的类库名称是包括命名空间的全名称)

<?php
namespace Home\Controller;
function __autoload($class_name) { 
 //echo $class_name."<br/>"; 
 require_once ("./".$class_name . ".php");  
}
use Admin\Controller\Index;
new Index; //new Index会触发__autoload()函数,返回Admin\Controller\Index到函数中
?>
Nach dem Login kopieren

(3):框架中定义的__autoload()函数或者是spl_autoload_register()函数在接收到传递过来的类库名称以后,框架会对名称进行处理,分析出类库名称所对应的文件路径,然后进行文件的加载。这里需要注意的是,不同的框架在解析类库名称,分析文件路径的方式是各不一致的,毕竟各自的目录结构是不一样的。

比如说,thinkphp:

 /**
  * 类库自动加载
  * @param string $class 对象类名
  * @return void
  */
 public static function autoload($class) {
  // 检查是否存在映射
  if(isset(self::$_map[$class])) {
   include self::$_map[$class];
  }elseif(false !== strpos($class,&#39;\\&#39;)){
   $name   = strstr($class, &#39;\\&#39;, true);
   if(in_array($name,array(&#39;Think&#39;,&#39;Org&#39;,&#39;Behavior&#39;,&#39;Com&#39;,&#39;Vendor&#39;)) || is_dir(LIB_PATH.$name)){ 
    // Library目录下面的命名空间自动定位
    $path  = LIB_PATH;
   }else{
    // 检测自定义命名空间 否则就以模块为命名空间
    $namespace = C(&#39;AUTOLOAD_NAMESPACE&#39;);
    $path  = isset($namespace[$name])? dirname($namespace[$name]).&#39;/&#39; : APP_PATH;
   }
   $filename  = $path . str_replace(&#39;\\&#39;, &#39;/&#39;, $class) . EXT;
   if(is_file($filename)) {
    // Win环境下面严格区分大小写
    if (IS_WIN && false === strpos(str_replace(&#39;/&#39;, &#39;\\&#39;, realpath($filename)), $class . EXT)){
     return ;
    }
    include $filename;
   }
  }elseif (!C(&#39;APP_USE_NAMESPACE&#39;)) {
   // 自动加载的类库层
   foreach(explode(&#39;,&#39;,C(&#39;APP_AUTOLOAD_LAYER&#39;)) as $layer){
    if(substr($class,-strlen($layer))==$layer){
     if(require_cache(MODULE_PATH.$layer.&#39;/&#39;.$class.EXT)) {
      return ;
     }
    }   
   }
   // 根据自动加载路径设置进行尝试搜索
   foreach (explode(&#39;,&#39;,C(&#39;APP_AUTOLOAD_PATH&#39;)) as $path){
    if(import($path.&#39;.&#39;.$class))
     // 如果加载类成功则返回
     return ;
   }
  }
 }
Nach dem Login kopieren

这里只是举例说明use与文件的自动加载没有关系,不强调各个框架是具体怎么完成自动加载,具体的可以自己看框架代码进行研究。

以上就是本文的全部内容,希望对大家的学习有所帮助。


相关推荐:

PHP使用SWOOLE扩展实现定时同步 MySQL 数据的方法

PHP关于对象知识总结

php中常量、静态属性、非静态属性的区别

Das obige ist der detaillierte Inhalt vonDas Schlüsselwort „use' in PHP und beim Laden von Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage