博客列表 >PHP类的自动加载与命名空间用法实例分析

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

P粉823318658
P粉823318658原创
2022年03月22日 12:38:51580浏览

这篇文章主要介绍了PHP类的自动加载与命名空间,结合实例形式分析了PHP类的自动加载与命名空间相关概念、原理、用法与操作注意事项,需要的朋友可以参考下

目录
类的自动加载
命名空间

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

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

类的自动加载
什么是自动加载类?

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

  1. 1
  2. void __autoload ( string $class )
  3. class即为待加载的类名。php官方手册也有比较好的例子,这里引用一下:
  4. ./myClass.php
  1. <?php
  2. //在这里定义一个构造方法
  3. class myClass {
  4. public function __construct() {
  5. echo "myClass init'ed successfuly!!!";
  6. }
  7. }
  8. ?>
  9. ``````php
  10. ./index.php
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5
  16. 6
  17. 7
  18. 8
  19. 9
  20. 10
  21. <?php
  22. // 将这些代码写在我们需要用到的地方
  23. function __autoload($classname) {
  24. $filename = "./". $classname .".php";
  25. include_once($filename);
  26. }
  27. // 实例化一个类
  28. $obj = new myClass();
  29. ?>
  1. "在这一行,我们的"./myClass.php"会被包含进来,这个神奇效果正是我们想要的 你将会得到"myClass init'ed successfuly!!!"的返回结果.
  2. 所以,如果你调用了一个类似于"myClass"的类,文件将会包含"myClass.php",前提是该文件存在(如果不存在你将会得到一个引用错误),如果你调用了"Foo","Foo.php"会被引用,诸如此类...
  3. 你在也不需要像下面这样写了。"
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. <?php
  11. include_once("./myClass.php");
  12. include_once("./myFoo.php");
  13. include_once("./myBar.php");
  14. $obj = new myClass();
  15. $foo = new Foo();
  16. $bar = new Bar();
  17. ?>
  1. 虽然说这个魔术方法确实很magic,但是他有一个缺点,那就是只能使用一次,当需要多条 autoload 函数的时候就不行了,所以官方不推荐使用,在后续版本可能会被移除。同时官方也给出了可以替代的函数spl_autoload_register,将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。
  2. bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
  3. 直接用例子在说明吧,这里与命名空间一起讲:
  4. #新建工程test
  5. //首先新建应用目录app,然后在目录下新建一个Test文件夹,文件夹下新建两个类
  6. test/app/Test/Beta.php
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. <?php
  9. namespace app\Test;
  10. class Beta {
  11. public function index() {
  12. echo "app\Test\Beta\index";
  13. }
  14. }
  1. test/app/Test/Test.php
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. <?php
  10. namespace app\Test;
  11. class Test {
  12. public function index() {
  13. echo "app\Test\Test\index";
  14. }
  15. }
  1. //新建自动加载类
  2. test/app/autoload/Loading.php
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. <?php
  15. namespace app\autoload
  16. class Loading {
  17. public static function autoLoad() {
  18. //把 \ 转换层 / , 便于兼容Linux文件找。Windows 下是通用的
  19. $fileName = str_replace('\\', '/', DIR . '\\'. $className) . '.php';
  20. if (is_file($fileName)) {
  21. require_once $fileName;
  22. } else {
  23. echo $fileName . ' is not exist'; die;
  24. }
  25. }
  26. }
  1. //新建应用入口文件
  2. test/index.php
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 10
  13. 11
  14. 12
  15. define('DIR', dirname(__FILE__));// /.../test
  16. //引入自动加载文件
  17. require DIR . "/autoload/Loading.php";
  18. //自动注册
  19. //这里就是为什么前面写成静态方法的原因
  20. spl_autoload_register("\\autoload\\Loading::autoLoad");
  21. //然后在下面就可以直接调用类了,只要在前面加上命名空间
  22. $beta = new app\Test\Beta();
  23. $beta->index();//输出 app\Test\Beta\index
  24. echo "\r\n";
  25. $test = new app\Test\Test();
  26. $test->index(); //输出 app\Test\Test\index
  1. 看到这里相信你应该已经对命名空间有了一个大致的了解,起码知道怎么用。
  2. 什么是命名空间?
  3. 从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
  1. 所以你可以将他理解为:文件夹。。。
  2. 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
  3. 希望本文所述对大家PHP程序设计有所帮助
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议