php命名空间实现的理解

[前言]

之前测试命名空间,文件头部明明定义了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,将会调用相关方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值