当前位置:Gxlcms > PHP教程 > php自动加载的两种实现方法_PHP教程

php自动加载的两种实现方法_PHP教程

时间:2021-07-01 10:21:17 帮助过:7人阅读

php自动载方法有两种.
第一种方案用__autoload,这个函数较简单,也较弱.
但有一问题没有解决, 就是在include前判断文件是否存在的问题.
代码如下:
  1. <br>set_include_path('aa' . PATH_SEPARATOR . get_include_path()); <br>function __autoload($className) <br>{ <br>//如果加这个检测, 因为此文件不在当前目录下,它就会检测不到文件存在, <br>//但include是能成功的 <br>if (file_exists($className . '.php')) { <br>  include_once($className . '.php'); <br>} else { <br>exit('no file'); <br>} <br>} <br>$a = new Acls(); <br> <br>第二种方案用spl自动加载,这里具体说一下这个. <br>spl_autoload_register() <br>一个简单的例子 <br><span style="CURSOR: pointer" onclick="doCopy('code46540')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>set_include_path('aa' . PATH_SEPARATOR . get_include_path()); <br>//function __autoload($className) <br>//{ <br>// if (file_exists($className . '.php')) { <br>// include_once($className . '.php'); <br>// } else { <br>// exit('no file'); <br>// } <br>//} <br>spl_autoload_register(); <br>$a = new Acls(); <br> <br>spl_autoload_register()会自动先调用spl_autoload()在路径中查找具有小写文件名的".php"程序.默认查找的扩展名还有".ini",还可以用spl_autoload_extenstions()注册扩展名. <br>在找不到的清况下,还可以通过自己定义函数查找 <br>如 <br>function loader1($class) <br>{ <br>//自己写一些加载的代码 <br>} <br>function loader2($class) <br>{ <br>//当loader1()找不到时,我来找 <br>} <br>spl_autoload_register('loader1'); <br>spl_autoload_register('loader2'); <br>还可以更多........ <br>MVC框架是如何实现自动加载的 <br>首先设置路径 <br>'include' => array( 'application/catalog/controllers', 'application/catalog/models', ),$include = array('application/controllers', 'application/models', 'application/library'); <br>set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $config['include'])); <br>在获取URL,解析出控制器与方法. <br>然后设置自动加载 <br><span style="CURSOR: pointer" onclick="doCopy('code24513')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>class Loader <br>{ <br>/** <br>* 自动加载类 <br>* @param $class 类名 <br>*/ <br>public static function autoload($class) <br>{ <br>$path = ''; <br>$path = str_replace('_', '/', $class) . '.php'; <br>include_once($path); <br>} <br>} <br>/** <br>* sql自动加载 <br>*/ <br>spl_autoload_register(array('Loader', 'autoload')); <br> <br>路由,实例化控制器,调用方法,你写的东西就开始执行了 <br><span style="CURSOR: pointer" onclick="doCopy('code64034')"><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>/** <br>* 路由 <br>*/ <br>public function route() <br>{ <br>if (class_exists($this->getController())) { <br>$rc = new ReflectionClass($this->getController()); <br>if ($rc->hasMethod($this->getAction())) { <br>$controller = $rc->newInstance(); <br>$method = $rc->getMethod($this->getAction()); <br>$method->invoke($controller); <br>} else <br>throw new Exception('no action'); <br>} else <br>throw new Exception('no controller'); <br>} <br> <br>初步的自动加载就完成了</li><li><p></p></li><li><p align="left"><span id="url" itemprop="url">http://www.bkjia.com/PHPjc/322152.html</span><span id="indexUrl" itemprop="indexUrl">www.bkjia.com</span><span id="isOriginal" itemprop="isOriginal">true</span><span id="isBasedOnUrl" itemprop="isBasedOnUrl">http://www.bkjia.com/PHPjc/322152.html</span><span id="genre" itemprop="genre">TechArticle</span><span id="description" itemprop="description">php自动载方法有两种. 第一种方案用__autoload,这个函数较简单,也较弱. 但有一问题没有解决, 就是在include前判断文件是否存在的问题. 复制代...</span></p></li><li> </li></ol></pre></li></ol></pre></li></ol></pre>

人气教程排行