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 相关文章推荐
PHP中使用foreach和引用导致程序BUG的问题介绍
Sep 05 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php实现求相对时间函数
Jun 15 PHP
PHP获取某个月最大天数(最后一天)的方法
Jul 29 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
php和vue配合使用技巧和方法
May 09 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
TP5框架页面跳转样式操作示例
Apr 05 PHP
php屏蔽错误及提示的方法
May 10 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 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上的memcache和memcached两个pecl库
2010/03/29 PHP
深入密码加salt原理的分析
2013/06/06 PHP
tp5框架使用cookie加密算法实现登录功能示例
2020/02/10 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
Jquery多选框互相内容交换的实例代码
2013/07/04 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
[52:07]完美世界DOTA2联赛PWL S3 LBZS vs access 第二场 12.10
2020/12/13 DOTA
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
利用Python找出序列中出现最多的元素示例代码
2017/12/08 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Python for i in range ()用法详解
2020/09/18 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
应届生会计电算化求职信
2013/10/03 职场文书
安阳殷墟导游词
2015/02/10 职场文书
营业员岗位职责范本
2015/04/14 职场文书
教师素质教育心得体会
2016/01/19 职场文书
《牧场之国》教学反思
2016/02/22 职场文书