PHP类的自动加载与命名空间用法实例分析


Posted in PHP onJune 05, 2020

本文实例讲述了PHP类的自动加载与命名空间用法。分享给大家供大家参考,具体如下:

作为一名合格的程序员,必定会有一个从面向过程编程到面向对象编程的转化过程,在这个过程中诸如命名空间,类,继承,接口,类自动加载等等都是需要我们去掌握的,之前对这些概念都不是很熟悉,只是能够基础地使用,在这里系统的记录一下关于命名空间与类的自动加载知识。

类的自动加载

什么是自动加载类?

? ? 从字面意思上就可以大概知道,当调用一个当前页面未定义的类的时候能够自动加载。
相信如果你之前了解过php的魔术方法的话,肯定不会对__autoload这个魔术方法感到陌生。php官方手册解释:尝试加载未定义的类

void __autoload ( string $class )

class即为待加载的类名。php官方手册也有比较好的例子,这里引用一下:

./myClass.php

<?php
//在这里定义一个构造方法
class myClass {
 public function __construct() {
  echo "myClass init'ed successfuly!!!";
 }
}
?>

./index.php

<?php
// 将这些代码写在我们需要用到的地方
function __autoload($classname) {
 $filename = "./". $classname .".php";
 include_once($filename);
}

// 实例化一个类
$obj = new myClass();
?>

"在这一行,我们的"./myClass.php"会被包含进来,这个神奇效果正是我们想要的 你将会得到"myClass init'ed successfuly!!!"的返回结果.

所以,如果你调用了一个类似于"myClass"的类,文件将会包含"myClass.php",前提是该文件存在(如果不存在你将会得到一个引用错误),如果你调用了"Foo","Foo.php"会被引用,诸如此类...

你在也不需要像下面这样写了。"

<?php
include_once("./myClass.php");
include_once("./myFoo.php");
include_once("./myBar.php");

$obj = new myClass();
$foo = new Foo();
$bar = new Bar();
?>

虽然说这个魔术方法确实很magic,但是他有一个缺点,那就是只能使用一次,当需要多条 autoload 函数的时候就不行了,所以官方不推荐使用,在后续版本可能会被移除。同时官方也给出了可以替代的函数spl_autoload_register,将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

直接用例子在说明吧,这里与命名空间一起讲:

#新建工程test

//首先新建应用目录app,然后在目录下新建一个Test文件夹,文件夹下新建两个类

test/app/Test/Beta.php

<?php
namespace app\Test;
class Beta {
 public function index() {
  echo "app\Test\Beta\index";
 }
}

test/app/Test/Test.php

<?php
namespace app\Test;
class Test {
 public function index() {
  echo "app\Test\Test\index";
 }
}

//新建自动加载类
test/app/autoload/Loading.php

<?php
namespace app\autoload
class Loading {
 public static function autoLoad() {
 //把 \ 转换层 / , 便于兼容Linux文件找。Windows 下是通用的
  $fileName = str_replace('\\', '/', DIR . '\\'. $className) . '.php';
  if (is_file($fileName)) {
   require_once $fileName;
  } else {
   echo $fileName . ' is not exist'; die;
  }
 }
}

//新建应用入口文件
test/index.php

define('DIR', dirname(__FILE__));// /.../test
//引入自动加载文件
require DIR . "/autoload/Loading.php";
//自动注册
//这里就是为什么前面写成静态方法的原因
spl_autoload_register("\\autoload\\Loading::autoLoad");
//然后在下面就可以直接调用类了,只要在前面加上命名空间
$beta = new app\Test\Beta();
$beta->index();//输出 app\Test\Beta\index
echo "\r\n";
$test = new app\Test\Test();
$test->index(); //输出 app\Test\Test\index

命名空间

看到这里相信你应该已经对命名空间有了一个大致的了解,起码知道怎么用。

什么是命名空间?

从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

所以你可以将他理解为:文件夹。。。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
php去掉文件前几行的方法
Jul 29 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
Smarty分页实现方法完整实例
May 11 PHP
详谈php静态方法及普通方法的区别
Oct 04 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
PHP微信网页授权的配置文件操作分析
May 29 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 PHP
如何在PHP中生成随机数
Jun 04 #PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 #PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 #PHP
PHP常用字符串函数用法实例总结
Jun 04 #PHP
TP3.2框架分页相关实现方法分析
Jun 03 #PHP
PHP Trait功能与用法实例分析
Jun 03 #PHP
PHP时间相关常用函数用法示例
Jun 03 #PHP
You might like
PHP脚本的10个技巧(6)
2006/10/09 PHP
用Flash图形化数据(一)
2006/10/09 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
JavaScript实现的CRC32函数示例
2016/11/23 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
Python内置函数及功能简介汇总
2020/10/13 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
西北政法大学自主招生自荐信
2014/01/29 职场文书
个人简历自我评价
2014/02/02 职场文书
2014年党的群众路线教育实践活动总结
2014/04/25 职场文书
国庆庆典邀请函
2015/02/02 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
创业计划书之家教托管
2019/09/25 职场文书
导游词之白茶谷九龙峡
2019/10/23 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android