如何使用php 命名空间(Namespaces)(3)关键字和自动加载

本文深入探讨PHP中的命名空间概念,包括__NAMESPACE__的作用、命名空间关键字的用途以及如何利用命名空间进行类的自动加载。通过具体示例展示了如何在实际项目中应用这些高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:https://www.sitepoint.com/how-to-use-php-namespaces-part-3-keywords-and-autoloading/

在前两篇文章中,我们看到了命名空间的基础,引入以及别名的使用。在最后的这一篇中,我们来讨论下更进阶的东西。

1.__NAMESPACE__

__NAMESPACE__是用来返回页面命名空间名称的。在全局的情况,他将返回空字符串。

<?php
namespace App\Lib1;
echo __NAMESPACE__; // outputs: App\Lib1
?>

很简单,对吧。这个功能主要用在debug的时候。当然也可以用在动态生成全限定Class名称的时候。比如下面:

<?php
namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}

$c = __NAMESPACE__ . '\\MyClass';
$m = new $c;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
?>

2.命名空间关键字

命名空间的关键字被用来明确的只出一个项目在一个命名空间,或者子空间。在class中他相当于self。

<?php
namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}

$m = new namespace\MyClass;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
?>

3.自动加载命名空间里的class

php的一大特色是节约时间。在全局(没有命名空间的时候)的php代码中。一个标准的自动加载function是这样的:

<?php
$obj1 = new MyClass1(); // classes/MyClass1.php is auto-loaded
$obj2 = new MyClass2(); // classes/MyClass2.php is auto-loaded

// autoload function
function __autoload($class_name) {
	require_once("classes/$class_name.php");
}
?>

在php 5.3中,你能创建一个关于class的命名空间实例。咋这种情况下,全限制的命名空间和class名称,被传给了__autoload function。比如$class_name的值是"AppLib1MyClass"。如果你替换掉同一目录下的所有class文件的,并且去掉命名空间的部分,那么,这里一定会报冲突的。

换一个思路,把你的class文件层次用命名空间的结构分开整理。就像/classes/App/Lib1这样。

\classes\App\Lib1\MyClass.php

<?php
namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}
?>

这个放在class下

myapp.php:

<?php
use App\Lib1\MyClass as MC;

$obj = new MC();
echo $obj->WhoAmI();

// autoload function
function __autoload($class) {

	// convert namespace to full file path
	$class = 'classes\' . str_replace('\\', '/', $class) . '.php';
	require_once($class);

}
?>

说明:

1.App\Lib1\MyClass 被重命名为MC

2.new MC()在编译的时候被转义为new App\Lib1\MyClass() 

3.我们这里通过__autoload()加载加载了App\Lib1\MyClass,这里将自动加载所有命名空间的路径。

4.如果不需要__autoload()加载,要手动加载require应该在new之前,而不是在最后,php把autoload提前执行了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值