Rumah >pembangunan bahagian belakang >tutorial php >PHP自动加载的实例详解

PHP自动加载的实例详解

零下一度
零下一度asal
2017-07-23 13:24:251825semak imbas

一个PHP项目,通常只有一个入口文件index.php,我们通常会在这个入口文件中写入自动加载函数,用来require以后会实例化的类文件。如:

<span style='font-family: "courier new", courier; font-size: 14px'>spl_autoload_register(function ($className) {</span><br><span style='font-family: "courier new", courier; font-size: 14px'>    require 'class/' . $className . '.php';</span><br><span style='font-family: "courier new", courier; font-size: 14px'>});</span><br><br><span style='font-family: "Microsoft YaHei"; font-size: 14px'>通过以上的代码,我们发现:在自动加载时,我们需要指定存放类的文件夹,以便找到相应的类。那么问题产生了。</span><br><br><strong><span style="font-size: 18px; background-color: #339966">在引入命名空间之前:</span></strong>

我们的项目目录

 

index.php

 

Controller.php

在index.php中我们需要实例化一个controller目录下的Controller类,并且调用这个对象的model()方法,而这个方法则需要实例化一个model目录下的Model类。我们运行一下index.php:

Warning: require(controller/Model.php): failed to open stream: No such file or directory

提示没有这个文件或目录。原因很简单:PHP在new Model()的时候,是自动去controller目录下去require的,所以找不到。

那么,我们的自动加载函数应该怎么写才能解决问题呢?很显然,把'controller/'换成'model/' 或者 不写目录,都不能正常加载。于是,使用命名空间的好处就显现出来了。

 

引入命名空间之后:

index.php

 

Controller.php

 

 

Model.php

我们按照文件目录的结构来为每个类写入命名空间,当在一个类中需要实例化另外一个类时,IDE会帮我们写入use namespace ;  。这样,我们在写自动加载的时候,就不用考虑将要加载的类在哪一个文件目录下了,只需要这样写:

<span style='font-family: "courier new", courier; font-size: 14px'>spl_autoload_register(function ($class) {</span><br><span style='font-family: "courier new", courier; font-size: 14px'>    require $class . '.php';</span><br><span style='font-family: "courier new", courier; font-size: 14px'>});</span><br><br><span style='font-family: "Microsoft YaHei"; font-size: 14px'>因为我们在index.php中use了所用到的类的命名空间,自动加载函数会到相应的命名空间中去寻找类(上述代码中的$class就相当于是'controller\Controller'),而这些类中又需要实例化其他的类,因为这些类中也声明了use <em>其他类的命名空间 </em>;,所以自动加载函数又会去相应的命名空间中去require其他类。</span><br><br><span style='font-size: 16px; font-family: "Microsoft YaHei"'>这样,我们就不会为加载类而发愁了,极大地解放了我们的编程负担。</span>

 

Atas ialah kandungan terperinci PHP自动加载的实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn