网站首页 > 技术教程 正文
1、什么是命名空间
所谓的命名空间就是为了解决函数、常量(const定义的常量)以及类的命名冲突问题。
2、使用命名空间解决命名冲突问题
基本语法:
namespace(关键词) + 空间名称(虚拟的, 与真实路径没有任何关系, 可以任意定义)
<?php
//定义命名空间
namespace First;
//定义一个类
class Controller{}
//定义命名空间
namespace Second;
//定义一个类
class Controller{}
?>
3、子命名空间
命名空间是虚拟的, 其定义方式也可以与路径相似, 采用多级结构。
<?php
//定义命名空间
namespace Admin\First;
//定义一个类
class Controller{}
//定义命名空间
namespace Home\Second;
//定义一个类
class Controller{}
4、命名空间注意事项
在实际项目开发中, 第一个命名空间前面不能出现任何其他代码! 谨记!!!
<?php
header("Content-type:text/html; charset=utf-8");
namespace Admin\First;
?>
Fatal error: Namespace declaration statement has to be the very first statement in the script in E:\wamp\apache\htdocs\20160624\namespace.php on line 3
5、命名空间的访问
第一种方式:非限定名称访问方式
<?php
namespace Admin\First;
class Controller{
public function __construct(){
echo 'first';
}
}
namespace Home\Second;
class Controller{
public function __construct(){
echo 'Second';
}
}
$construct = new Controller(); //Second
?>
遵循的原则:就近原则
第二种方式:限定名称访问方式(需要使用use引入命名空间)
<?php
namespace Admin\First;
class Controller{
public function __construct(){
echo 'first';
}
}
namespace Home\Second;
class Controller{
public function __construct(){
echo 'Second';
}
}
// 使用use引入命名空间
use Admin\First;
$construct = new Controller(); //Second 引入空间不会改变访问空间,还是访问当前空间
echo "<hr>";
$construct = new First\Controller(); //First
?>
特别说明:默认情况下, 使用use方法引入命名空间并不会改变空间路径, 访问的还是就近的命名空间。如何解决以上问题呢?
答:使用限定名称访问方式
$对象 = new 命名空间\类名称的形式
use 也可以引入命名空间+类名
<?php
namespace Admin\First;
class Controller{
public function __construct(){
echo 'first';
}
}
namespace Home\Second;
class Controller{
public function __construct(){
echo 'Second';
}
}
// 使用use引入命名空间
use Admin\First\Controller;
$construct = new Controller(); //Second 引入空间+类还是不会改变访问空间,还是访问当前空间
?>
第三种方式:完全限定名称访问命名空间
<?php
namespace Admin\First;
class Controller{
public function __construct(){
echo 'first';
}
}
namespace Home\Second;
class Controller{
public function __construct(){
echo 'Second';
}
}
$construct = new \Admin\First\Controller(); //First
?>
注意:完全限定访问方式必须以"\"方式访问;
6、使用use导入空间类(ThinkPHP框架导入方式)
基本语法:
use 命名空间\类名称;
<?php
namespace Admin\Controller;
use Think\Controller;
?>
特殊情况说明:如果导入的类名称与当前命名空间下的类名称一致, 就会出现名称冲突问题, 这可以使用别名的方式解决:
示例代码:
<?php
namespace Admin\First;
class Controller{
public function __construct(){
echo 'first';
}
}
namespace Home\Second;
class Controller{
public function __construct(){
echo 'Second';
}
}
// 使用use引入命名空间
use Admin\First\Controller as FirstController;
$construct = new Controller(); //Second 引入空间+类还是不会改变访问空间,还是访问当前空间
$construct = new FirstController(); //First
?>
7、公共命名空间
当我们在一个命名空间下引入一个没有定义命名空间的函数、常量以及类, 我们把这种情况就称之为公用命名空间。
公共命名空间下的元素访问必须使用完全限定方式。
$std = new \stdClass();
8、const和define的区别:
前者针对命名空间发生影响, 后者不发生影响。
const可以声明多个同名称的常量
define对同名称常量只能声明一个
控制器:
//1、定义命名空间
namespace Admin\Controller;
//2、引入核心控制器
use Think\Controller;
//3引入核心模型, 必须使用此种方法
use Think\Model;
//4 引入自定义模型
use DeptModel;
//4、定义自定义控制器
class PublicController extends Controller {
//5 定义login方法
public function login() {
//通过display方法显示输出模板内容
$this->display();
}
}
Admin: 模块
Controller: 控制器
Admin\Controller: 代表Admin模块下的控制器
Think\Controller: 代表Think核心的控制器
模型:
<?php
//1、定义命名空间
namespace Admin\Model;
//2、引入核心模型
use Think\Model;
//3、定义Dept模型
class DeptModel extends Model {
}
Admin: 模块
Model: 模型
Admin\Model: 代表Admin模块下的模型
Think\Model: 代表Think核心的模型
命名空间下加载文件和实例化类方法
require_once("./plugins/payment/wxpay/Api.php"); //避免重复加载
$input= new \WxPayUnifiedOrder();
注意: 在命令空间外使用define()定义的常量是无法使用的, 应当使用const定义常量;
class_exists()和method_exists()使用
bool class_exists ( string $class_name [, bool $autoload = true ] )
检查指定的类是否已定义。
class_name 类名。名字的匹配是不分区大小写的。
autoload 是否默认调用 __autoload。
bool method_exists ( mixed $object , string $method_name )
检查类的方法是否存在于指定的 object中。
object 对象示例或者类名。
method_name 方法名。
<?php
namespace Admin\First;
class Controller{
public function __construct(){
echo 'first';
}
public function say(){
echo "这是一个说话的方法";
}
}
namespace Home\Second;
class Controller{
public function __construct(){
echo 'Second';
}
public function say(){
echo "这是一个说话的方法";
}
}
if(class_exists("Admin\First\Controller")){
echo "Controller类存在<br/>";
$obj = new \Admin\First\Controller();
if(method_exists($obj, "say")){
echo "say方法存在";
}
}else{
echo "Controller不存在";
}
echo "<br/>";
echo Controller::class; //Home\Second\Controller 返回 完成 的class类名 PHP5.5新增
?>
PHP 类名::class含义
自 PHP 5.5 起, 关键词 class 也可用于类名的解析。
使用 ClassName::class 可以获取一个字符串, 包含了类 ClassName 的完全限定名称。这对使用了命名空间的类尤其有用。
<?php
namespace ddd\vector;
class Demo
{
public function test()
{
// code...
}
}
echo Demo::class; //ddd\vector\Demo
?>
猜你喜欢
- 2024-10-21 常见面试问题之-设计模式 重要包含PHP代码实现额,PHP开发者必看
- 2024-10-21 php生命周期介绍(php的生命周期, 启动流程, 多看tipi)
- 2024-10-21 Laravel框架命名空间的定义(laravel框架关键技术解析)
- 2024-10-21 网站建站流程-空间购买(网站空间商选择考虑三大因素)
- 2024-10-21 准确JavaScript世界观:复杂值vs原始值&&内存空间(1)
- 2024-10-21 如何搭建个人博客网站?角点科技教你搭建博客网站
- 2024-10-21 建设属于自己的网站需要什么(建设属于自己的网站需要什么资质)
- 2024-10-21 省钱了!使用极空间搭建一个免费的MariaDB数据库并实现远程访问
- 2024-10-21 Windows+Apache+MySQL+PHP4 官方推荐详细安装步骤
- 2024-10-21 PHP内存管理机制与垃圾回收机制(php 内存模型)
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)