zoukankan      html  css  js  c++  java
  • PHP 命名空间加载的理解

    关于spl_autoload_register()和__autoload(),相信大多数都会选择前者了? 看两者的用法:

    //__autoload用法
    function __autoload($classname)
    {
        $filename = "./class/".$classname.".class.php";
        if (is_file($filename))
        {
            include $filename;
        }
    }

    //spl_autoload_register用法
    spl_autoload_register('load_class');

    function load_class($classname)
    {
        $filename = "./class/".$classname.".class.php";
        if (is_file($filename))
        {
            include $filename;
        }
    }

    使用spl_autoload_register()的好处是不可言喻的:
    (1)自动加载对象更加方便,很多框架都是这样做的:


    class ClassAutoloader {
        public function __construct() {
            spl_autoload_register(array($this, 'loader'));
        }
        private function loader($className) {
            echo 'Trying to load ', $className, ' via ', __METHOD__, "() ";
            include $className . '.php';
        }
    }

    $autoloader = new ClassAutoloader();

    $obj = new Class1();
    $obj = new Class2();

    (2)你要知道__autoload()函数只能存在一次啊,spl_autoload_register()当然能注册多个函数


    function a () { 
        include 'a.php';

    function b () { 
        include 'b.php';

    spl_autoload_register('a'); 
    spl_autoload_register('b'); 

    (3)SPL函数很丰富,提供了更多功能,如spl_autoload_unregister()注销已经注册的函数、spl_autoload_functions()返回所有已经注册的函数等。

    首先题主要搞清楚一个概念,PHP命名空间中的  fooAnother 并不一定是指:当前目录下有个foo目录,里面有个Another 文件,文件内有个 Another Class 这个概念是完全错误的!(或者说这是一种习惯或规范)。

    !!PHP命名空间的注册仅仅是一个字符符号注册而已,和任何目录、文件没有关系!!

    所以命名空间的操作 一般会借助于 autoload 来自动加载文件,说白了还是需要 require 文件的。

    只不过这个过程被 autoload 消化掉了,至于 autoload 怎么去引入文件 那要看你怎么编写 autoload 函数了。

    例如:当autoload接收到参数为 fooAnother 时,把 foo 替换成 fooPlugin 然后去目录找文件 fooPlugin/Another.php 也很正常。

    然后进行 require 文件,当 require 成功时(Another.php 内肯定要声明自己的命名空间,达到注册的目的), 此时你使用 fooAnother 系统会在已注册的命名空间符号内搜索(上面已经注册了):fooAnother直接实例化。

    总结:

    1、namespace 仅仅是符号注册! 和目录,文件没关系,具体引入文件需要依赖于 autoload。

    2、补充autoload知识:当用户去实例化一个不存在的类/命名空间时,会触发用户已经注册的 autoload 函数,在此函数内可以进行字符串目录、文件拼接,最后require进来相应文件。此时 这个类就堂而皇之的存在了。So... 你 new 成功了。

  • 相关阅读:
    java编程题古典算法之兔子问题
    java基础之final关键字
    java基础之final关键字
    java基础之静态代码块,局部代码块,构造代码块区别。
    java基础之静态代码块,局部代码块,构造代码块区别。
    java基础之完数判断
    java基础之完数判断
    java基础之二维数组不定义列数
    正则表达式快速入门
    深入理解JSON对象
  • 原文地址:https://www.cnblogs.com/swing07/p/5242047.html
Copyright © 2011-2022 走看看