PHP 使用命名空间(namespace),实现自动加载
示例:
#/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql
{ public function __construct()
{
var_dump(__FILE__);
}
}
#/index.php namespace Home; use DB\MySql; $mysql = new MySql();
报错
Fatal error: Class 'DB\MySql' not found in D:\localhost\demo\space\index.php on line 23
修改
修改 index.php 改成如下,可以了,但是为什么不能自动加载?
namespace Home; use DB\MySql; spl_autoload_register(function ($class) {
if ($class) {
$file = str_replace('\\', '/', $class);
$file .= '.class.php';
if (file_exists($file)) {
include $file;
}
}
}); $mysql = new MySql();
要点:
第一:
命名空间跟文件加载并无直接关系,只是有些语言,将命名空间结构和文件结构对应起来了。 以php为例,一般的命名空间结构,跟php文件结构是存在映射关系的,通过命名空间名称,就能算出该类的实际存储位置, 然后实例化的时候,会触发用设置的spl自动加载函数将文件引入。
(Xee:命名空间是事先通过自动导入或者include,require之类导入的,然后会根据命名空间对应起来,实现自动载入)
第二:
namespace Home;
use DB\MySql;
$mysql = new MySql();
实际执行代码的时候是 new \DB\MySql();
找不到这个文件的时候就会调用你的autoload函数 并file_exists("DB/MySql.class.php")
,在当前目录下查找这个文件,在找不到的情况下然后就是你看到的错误
(Xee:在被调用的MySql.class.php文件中,也要有\DB\MySql的命名空间)
第三:
如果刚开始了解php命名空间,去看如何使用PHP命名空间;多翻翻使用命名空间的框架的源码,如micro-mvc,slim等。
还有PSR-4——新鲜出炉的PHP规范,其中就有这个:
* // register the base directories for the namespace prefix
* $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
* $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');
第四:
我们常用 db\mysql,这种形式的命名空间!不是一定要使用\这个反斜线的,还可以使用例如:db::mysql;或者db_mysql等;要在自动查找类的函数方法中进行分析.
<参考:PHP命名空间 namespace 如何实现自动加载>
PHP 使用命名空间(namespace),实现自动加载的更多相关文章
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
- 【php】命名空间 和 自动加载的关系
目的 本文的目的主要是说明 命名空间的 use 关键词 和 new ClassName 这两个步骤,哪个步骤才会执行自动加载,这是逻辑有点混乱的表现,这种想法也是很正常的,让我们来解密吧 命名空间(n ...
- PHP 命名空间以及自动加载(自动调用的函数,来include文件)
这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...
- PHP命名空间与自动加载类详解
本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大 ...
- PHP 命名空间与自动加载机制
include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...
- PHP 命名空间与自动加载机制介绍
include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...
- PHP面向对象深入研究之【命名空间】与【自动加载类】
命名空间 避免类名重复,而产生错误. <?php require_once "useful/Outputter.php"; class Outputter { // outp ...
- PHP 命名空间和自动加载
PHP 命名空间 php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类.函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空 ...
- final关键字,类的自动加载,命名空间
final关键字 1.final可以修饰方法和类,但是不能修饰属性: 2.Final修饰的类不能被继承: 3.Fina修饰的方法不能被重写,子类可以对已被final修饰的父类进行访问,但是不能对父类的 ...
随机推荐
- 利用iconv进行文件编码批量原地转换
将当前目录及其所有子目录中的以 java 为后缀的文件,从 GB18030 转换为 UTF-8: find . -name "*.java" -exec sh -c " ...
- CMD.EXE中dir超长字符串缓冲区溢出原理学习
最近看逍遥的<网络渗透攻击与安防修炼>讲到CMD命令窗口的dir传超长字符串溢出的例子.自己实验了一下,的确会产生程序崩溃,但是具体什么原理没太详细说,这里做一下原理探究,权当学习笔记了. ...
- iOS WebView调用JS的一个小坑
假如调用一个函数,传入的参数为String,要以这样的格式传入: let resultStr="1234" self.webView.stringByEvaluatingJavaS ...
- TCP/IP详解 笔记十一
域名服务系统(DNS) DNS:名字到IP转换:电子邮件选路信息:分布式数据库 解析器:是通过gethostbyname(3)和gethostbyaddr(3)来实现的 最常用的名字服务器是BIND ...
- 个人作业—Week1
针对教材内容的问题 阅读教材<软件工程——实践者的研究方法>Roger S.Pressman 在笼统地阅读了教材,大致理清教材知识结构后,提出以下问题作为今后学习地重点: 1) 什 ...
- CF724C: Ray Tracing
传送门 CF的题质量真心不低,这道题的标准解法(应该)是exgcd,打比赛的时候想到了具体的推导公式了,也意识到了需要用exgcd,但是因为寝室要锁门了(其实就是太弱,就放弃了. 首先很显然,这条线所 ...
- gnuplot使用3
linetype set linetype命令允许用户重定义默认的显示线的类型,该命令的选项跟"set style line"是一样的.于"set style line& ...
- JS010-DOM
JS010-DOM 本章内容: 1.理解包含不同层次节点的DOM 2.使用不同的节点类型 3.客服浏览器兼容性问题及各种陷阱 DOM(文档对象模型)是针对 HTML和xml文旦过得一个API(应用程序 ...
- 创建 sequence
-- Create sequence create sequence XRMKSD_DET_SEQminvalue 1maxvalue 999999999999999999999999999start ...
- join和setdaemon()初探
join()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程 ...