zoukankan      html  css  js  c++  java
  • PHP的命名空间 与类是自动加载

    namespace

    假设如果不使用namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。

    引入namespace之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。

    代码

    目录结果

    A_def.php

    namespace my_api
    amed;
    
    class A {
    
        public function def1() {
            echo 11;
        }
        
        public static function  static_def(){
            echo 'static';
        }
    
    }

    test.php

    require_once("api/A_def.php");
    $a = new my_api
    amedA();
    $a->def1();
    
    $b= my_api
    amedA::static_def();
    print_r($b);

    namespace 后的命名空间起始不能用“”,

    Fatal error: Undefined constant 'my_namespace' in……………………

    -----------------------------------------------------------------

    spl_autoload_register

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

    将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。

    如果在你的程序中已经实现了__autoload()函数,它必须显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()spl_autoload_call()

    如果需要多条 autoload 函数,spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

    *注  __autoload 将会废弃

    // function __autoload($class) {
    //     include 'classes/' . $class . '.class.php';
    // }
    
    function my_autoloader($class) {
        include 'classes/' . $class . '.class.php';
    }
    
    spl_autoload_register('my_autoloader');
    
    // 或者,自 PHP 5.3.0 起可以使用一个匿名函数
    spl_autoload_register(function ($class) {
        include 'classes/' . $class . '.class.php';
    });

    Yii2 注册类使用spl_autoload_register 所以文件名和命名空间的路径必须一直

    目录结构

    B.php

    namespace my_namespace;
    
    class B {
        
        public static function  static_def(){
            echo 'static';
        }
    
    }

    test.php

    /**
     * spl_autoload_register
     */
    function my_autoloader($class) {
        $class= str_replace('my_namespace', '', $class);
        include 'api/' . $class . '.php';
    }
    spl_autoload_register('my_autoloader');
    
    $c= my_namespaceB::static_def();
  • 相关阅读:
    生成前N个自然数随机置换的3个程序
    网络流媒体协议之——RTSP协议
    海思屏幕HAL代码解析
    事件路由
    hi3559v100 sdk中双系统AMP架构的初步了解
    LCD RGB 控制技术 时钟篇(下)【转】
    liteos C++支持(十七)
    liteos MMU(十八)
    APP接口做什么?
    APP如何进行通信的
  • 原文地址:https://www.cnblogs.com/dcb3688/p/4607999.html
Copyright © 2011-2022 走看看