好好爱自己!

PHP 命名空间以及自动加载(自动调用的函数,来include文件)

这篇文章的目的是记录

  1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数,

  2 .php中命名空间的使用。

一、当不使用命名空间的时候

  a.php

复制代码
<?php
//namespace A;

const test='Atest';
function test(){
    return __FUNCTION__;
}
class Test
{
    public function __construct(){
        return __METHOD__;
    }
}
复制代码

  b.php

复制代码
<?php
//namespace B;
//use A as aaa;
const btest='Btest';
function __autoload($a){
    include_once './a.php';
}
//spl_autoload_register('load');


function btest(){
    return __FUNCTION__;
}
class BTest
{
    public static function load(){
        include_once './a.php';
    }

    public function __construct(){
        return __METHOD__;
    }
}
$a = new Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);
复制代码

在b.php 中 $a = new Test()时, 会自动调用__autoload()函数,include a.php文件进来,这样就可以实例化Test类成功!!

在这种情况下, 通过 

spl_autoload_register('load');
这种方式也是可以实现自动调用 load()函数,从而实现include a.php文件的,这两种方式差不多。这个时候的b.php文件如下:

复制代码
<?php
//namespace B;
//use A as aaa;
const btest='Btest';
function load($a){
    include_once './a.php';
}
spl_autoload_register('load');


function btest(){
    return __FUNCTION__;
}
class BTest
{
    public static function load(){
        include_once './a.php';
    }

    public function __construct(){
        return __METHOD__;
    }
}
$a = new Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);
复制代码

 

二、使用命名空间的情况:

  a.php

复制代码
<?php
namespace A;

const test='Atest';
function test(){
    return __FUNCTION__;
}
class Test
{
    public function __construct(){
        return __METHOD__;
    }
}
复制代码

  b.php

复制代码
<?php
namespace B;
use A as aaa;
const btest='Btest';
function load(){
    include_once './a.php';
}
spl_autoload_register('B\load');


function btest(){
    return __FUNCTION__;
}
class BTest
{
    public static function load(){
        include_once './a.php';
    }

    public function __construct(){
        return __METHOD__;
    }
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);
复制代码

  b.php也可以改成下面这样,注册一个类中的方法为 “自动加载方法”

复制代码
<?php
namespace B;
use A as aaa;
const btest='Btest';
spl_autoload_register(array('B\BTest', 'load'));


function btest(){
    return __FUNCTION__;
}
class BTest
{
    public static function load(){
        include_once './a.php';
    }

    public function __construct(){
        return __METHOD__;
    }
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);
复制代码

特别注意,当使用了命名空间后, 原来全局的__autoload()函数现在不会自动调用,也就是说,下面的b.php是不会骑作用的,也是报错

    Fatal error: Class 'A\Test' not found in D:\wnmp\www\shine_orm\Test\b.php on line 22

复制代码
<?php
namespace B;
use A as aaa;
const btest='Btest';


function btest(){
    return __FUNCTION__;
}
function __autoload($aad){
    include_once './a.php';
}
//spl_autoload_register('B\__autoload');
class BTest
{

    public function __construct(){

        return __METHOD__;
    }
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);
复制代码

必须手动将__autoload()函数注册才可以。。(也就是将 //spl_autoload_register('B\__autoload'))这一行的注释去掉才可以。下面是修改后的b.php

复制代码
<?php
namespace B;
use A as aaa;
const btest='Btest';


function btest(){
    return __FUNCTION__;
}
function __autoload($aad){
    include_once './a.php';
}
spl_autoload_register('B\__autoload');
class BTest
{

    public function __construct(){

        return __METHOD__;
    }
}
$a = new aaa\Test();
var_dump($a);
//include_once 'a.php';
//spl_autoload_register(array('\B\Test','load'));
//$a = new aaa\Test();
//var_dump($a);
复制代码

 

下面这段话是别人总结的,随手拿过来用吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
自动加载
第一段:
    每个文件既要申明命名控件又要手动 include 是非常不智能的事情,所以在自己的PHP系统或者框架中可以使用自动加载技术,让系统自己去找
 
最简单的方式是利用函数 __autoload 函数,但是这个函数只能在非命名控件下定义,也就是全局情况下:
 
function __autoload($class) {
  $dir = ’./’;
  set_include_path(get_include_path().PATH_SEPARATOR.$ids_dir);
  $class = str_replace(’\’, ’/’, $class) . ’.php’;
  require_once($class); }
如果在已经有了命名空间的类中,可以使用函数 spl_autoload_register 来注册一个类中的方法来代替 __autoload
 
第二段:
     命名空间的作用:
假设如果不使用 php命名空间 namespace,那么每个类在一个项目中的名字就必须是固定的。因为php在new的时候不管是调用autoload还是调用已加载过的类,都存在一个类名对应的文件。所以在没有php命名空间namespace的时候,我们会想各种命名规则来区分不同的类,比如project1_school1_class1_Student或者project2_school_class_Student。 引入php namespace 之后就可以将这个有效规避了,一个namespace就相当于对应一个文件路径,查找这个类的时候,就会去对应的文件路径查找类定义文件了。
 
php命名空间↑
什么是php命名空间呢?
 
命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
简单说来命名空间 是为了解决不同库在同一个环境下使用时出现的命名冲突。例如我自己有一个函数名叫A,但是系统已经有一个A函数了,那就会出现冲突

  

posted @   立志做一个好的程序员  阅读(603)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示