zoukankan      html  css  js  c++  java
  • PHP 命名空间和自动加载

    PHP 命名空间

    php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类、函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空间,才能访问它所包含的项。

    声明命名空间

    namespace my;
    require_one 'outputter3.php';
    
    class outputter {
        // 输出数据
    public function helloworld() {
    echo "hello world!";
    }
    } namespace useful; class outputter { }

    namespace 关键字用于创建命名空间,而且一般声明命名空间时,namespace 必须发到文件中的第一句,PHP还支持声明嵌套的命名空间,如 

    namespace comgetinstanceutil;

    使用命名空间

    在本命名空间内部可以直接调用命名空间中的类或函数、变量,

    因为我已经位于命名空间中了,所以不必在类名前加任何种类的路径,

    如果打算从命名空间环境之外访问类,可以使用:

    comgetinstanceutilDebug::helloworld();

    以下代码将会报错:

    namespace main;
    
    comgetinstanceutilDebug::helloworld();

    因为使用的相对命名空间,PHP会在 main 命名空间中寻找 comgetinstanceutil,但没有找到,就像创建绝对 URL 和文件路径时,以分隔符作为开始一样,你也可以使用这种方式创建绝对命名空间,如下:

    namespace main;
    
    comgetinstanceutilDebug::helloworld();

    前导的反斜杠告诉 PHP 从根命名空间而不是从当前命名空间开始搜索。

    但是如果每次调用命名空间都需要写这么长的一串前缀是不合理的,PHP 可以使用 use 关键词为当前命名空间中的其他命名空间起别名,如下:

    namespace main;
    use comgetinstanceutil;
    
    utilDebug::helloworld();

    导入 comgetinstanceutil,并隐式地为其使用了别名 util。

    如果不想引入命名空间,可以导入 Debug 类本身:

    namespace main;
    use comgetinstanceutilDebug;
    
    utilDebug::helloworld();

    关键字 use 之后使用 as,可以将别名 Debug 修改为 uDebug

    namespace main;
    use comgetinstanceutilDebug as uDebug;
    
    uDebug::helloworld();

    在命名空间中访问全局空间(非命名空间),可以在该全局类前加反斜杠:

    namespace comgetinstanceutil;
    require "global.php";
    
    Lister::helloworld();   //访问全局空间
    Lister::helloworld();   //访问本地命名空间

    使用 __NAMESPACE__ 常量可以输出当前的命名空间,在调试时有用。

    自动加载 

    PHP5 引入了 __autoload() 方法来自动包含类文件,当 PHP 引擎遇到试图实例化未知类的操作时,会调用 __autoload() 方法(如果已经定义),并将类名当作字符串参数传递给它,编写 __autoload() 时,应该定义一种策略来定位和包含缺失的类文件。如下:

    function __autoload($classname) {
        include_once("$classname.php");
    }
    $product = new ShopProduct();
  • 相关阅读:
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Number Challenge(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 Rotatable Number(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
    Python位运算符
  • 原文地址:https://www.cnblogs.com/ryanzheng/p/9632531.html
Copyright © 2011-2022 走看看