PHP的命名空间 与类是自动加载

namespace

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

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

 

代码

目录结果

A_def.php

namespace my_api\named;

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\named\A();
$a->def1();

$b= my_api\named\A::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_namespace\B::static_def();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值