[前言]
之前测试命名空间,文件头部明明定义了namespace,并且类文件的存放位置与相对路径也一致,但use之后仍提示“找不到类”,为什么?
[原理分析]
1.根据use的值确定类文件的物理存储位置,然后通过require_one将类文件加载;
2.类文件名称与类名称需要有一定的对应规则,方便autoload方法找到并加载类文件;
3.类文件的namespace值需要与实际相应路径一致。
4.常见错误:类文件的namespace值与实际路径不一致,类名称与类文件名称没有对应关系。
[示例目录结构]
namespaceDemo
--mk.php
--libs
---Demo.class.php
[示例代码]
mk.php
<?php namespace mk; /*命名空间支持 Start*/ function autoload($relativePath){ $file=__DIR__.substr($relativePath,2).'.class.php'; $file=str_replace('\\','/',$file); echo 'class:'.$file; echo "\r\n"; if(file_exists($file)){ require_once $file; } } spl_autoload_register('\mk\autoload'); /*命名空间支持 End*/ use \mk\libs\Demo; $app=new Demo(); $app->run();
Demo.class.php
<?php //namespace 必须与类文件实际相应路径一致 namespace mk\libs; //类文件名与类名需要有一定的对应关系 class Demo { public function run(){ try{ $this->index(); }catch (\Exception $e) { echo 'exception:' . $e->getMessage() . ' ' . $e->getFile() . ' ' . $e->getLine(); } catch (\Error $e) { echo 'error:' . $e->getMessage() . ' ' . $e->getFile() . ' ' . $e->getLine(); } } private function index(){ echo 'This is '.__CLASS__.' class'; exit; } }
直接访问mk.php,将会调用相关方法。