命名空间

当项目比较大时 可能会出现重名的情况 这个时候就需要用到命名空间这个机制
命名空间的本质就是在代码段 把代码段分区域隔离出来
关键字namespace主要包括三种空间元素函数 类 常量由于变量是存储在栈中 所以命名空间这个机制不包括变量
声明namespace sapce1 ;
访问: 只访问本空间内的空间元素 使用非限定符名称 直接调用函数 或者 实例类 或者使用常量
访问子空间的空间元素 需要用到 限定名称 子空间名\空间元素名意味着自动把当前空间作为父空间加入到路径中
还有一种绝对路径访问 \空间一\空间一的子空间\空间元素名绝对路径访问开头必须带\ 限定名称访问不带的原因是 系统默认把当空间作为父空间

<?php 
#命名空间的声明 上面不能有其他代码  
namespace space1;
$a=10;
class test{
public function show(){
    echo __METHOD__;//魔术常量 __NAMESPACE__返回当前命名空间
}
}
const PI =3.1415926;
function getNamespace(){
echo __NAMESPACE__;
}
getNamespace();//space1 同空间直接访问
inspace1\getNamespace();//space1 \ inspace1访问子空间的空间元素 
\space1\inspace1\getNamespace();//更推荐完全名称访问
namespace space1\inspace1;
function getNamespace(){
    echo __NAMESPACE__;
}

#空间中可以包含在空间 就像文件夹可以包含文件夹一样 但是一般不超过四层 
namespace soace2;
#一般一个文件一个空间 这里学习测试用
echo $a;//10
class test{
    public function show(){
        echo __METHOD__;//魔术常量 __NAMESPACE__返回当前命名空间
        echo "<br/>";
}
}
const PI =3.1415926;
function getNamespace(){
    echo __NAMESPACE__;
}
#可以利用完全限定名称跨空间访问
\space1\inspace1\getNamespace();
//两个空间中 类 函数 常量  完全一样但是不会报错
?>

命名空间的引入
在实际开发中 几乎每个文件都有空间 每次访问都依赖于完全限定名称太麻烦可以利用空间的引入就是将一个空间的元素引入到当前的空间
引入类 : use spaceName\className
引入函数 use function spaceName\ functionname
引入常量:use const spaceName\constName
引入函数与常量需要告诉系统引入的类型
当引入的空间属性与当前空间的属性重名时就要使用as重命名来去冲突

<?php 
namespace space1;
class Man{
    public $name;
}
const PI =3.14;
function getNamespace(){
    echo "<br/>",__NAMESPACE__;
}
namespace space2;
#使用Man类 下面这种使用绝对路径的方法可以达到 但是不推荐
//$s = new \space1\Man();
//更推荐下面这种引入的方式  use *** space\***默认在全局空间下面寻找空间 
use space1\Man;
$s = new Man();
var_dump($s);//object(space1\Man)#1 (1) { ["name"]=> NULL }
use const space1\PI;
echo PI;//3.14
function getNamespace(){
    echo "<br/>",__NAMESPACE__;
}
use function  space1\getNamespace as get2;//去冲突或者会报错
getNamespace();//space2
get2();//space1 as 追后就可以使用别名操作 
?>

引入不仅可以引入单个空间元素 还可以同时引入多个空间元素
第一种方法是 利用,分割 不同元素必须以逗号隔开 虽然可以引入多个空间元素 但是所有的空间 元素必须是同一类型
引入多个类: use spaceName \ calssname1,spaceName \classname2,spaceName \classname3
引入多个函数use function spaceName\function1,spaceName \function2,spaceName \function3;
引入多个常量use const spaceName\const1,spaceName \const2,spaceName \const3;

<?php 
namespace space1;
class Man{
    public $name;
}
const PI =3.14;
function getNamespace(){
    echo "<br/>",__NAMESPACE__;
}
function getDir(){
    echo "<br/>",__DIR__;
}
function getFunction(){
    echo "<br/>",__FUNCTION__;
}
namespace space2;
#同时引入多个方法 
use function space1\getNamespace,space1\getDir,space1\getFunction;
getNamespace();
getDir();
getFunction();
?>

还有一种方法是利用{}把要引入的东西包裹进入 更推荐这种

<?php 
namespace space1;
class Man{
    public $name;
}
const PI =3.14;
function getNamespace(){
    echo "<br/>",__NAMESPACE__;
}
function getDir(){
    echo "<br/>",__DIR__;
}
function getFunction(){
    echo "<br/>",__FUNCTION__;
}
namespace space2;
#同时引入多个类 常量 函数
use space1\{
    Man,
    function getNamespace,
    function getDir,
    function getFunction,
    const PI
};
$s = new Man();
var_dump($s);//object(space1\Man)#1 (1) { ["name"]=> NULL }
getDir();//F:\server\secondweb
getFunction();//space1\getFunction
getNamespace();//space1
?>

当直接引入一个空间时 use space1而不说明具体引入什么时 就相当于把所有的东西引入此空间 并且把该空间当作子空间对待 。
全局空间
全局空间就是顶级空间 我们以前大多数都不会定义空间 这时这些空间元素就处于全局空间当中
1全局空间没有自己的名字
2所有空间本质上都是在全局空间划分的
3既可以用非限定名称直接访问也可以使用限定名称访问例如 \show();

<?php 
namespace spqce1;
echo PHP_VERSION;//7.3.6 当前空间中没有该常量时就会到全局空间中寻找  如果空间内有定义该常量就会使用空间内的常量
//$a = new  mysql("localhost","root","980613","studtphp");//当空间中实例化空间不存在的对象时 会报错
$s =  new \mysqli("localhost","root","980613");//如图所示 在全局空间中寻找
?>

命名空间的使用案例
我们在系统中建立了一个root根目录 根目录下有controller业务模型 model 数据核心 core核心工具还有一个index.php作为入口 controller文件夹下面有collere.class.php文件 model文件夹下有user.class.php core文件夹下有DB.class.php文件
index.php入口文件

<?php 
//入口
include_once "./controller/collere.class.php";
$u = new \collere\user();
$u->index();
/*获取到user数据查询到用户数据
初始化成功
正在查询数据*/
?>

collere.class.php

<?php 
namespace collere;
include_once "./model/user.class.php";
class user{
    public function index(){
        echo "获取到user数据";
        $s = new \modespace\Model();
        $s->getAlluser();
    }
}

user.classs.php

<?php 
namespace modespace;
include_once "./core/db.class.php";

class Model{
    public function getAlluser(){
        echo "查询到用户数据","<br/>";
        $s = new \corespace\Core();
        $s->query();
    }
}
db.class.php
<?php 
namespace corespace;
class Core{
    public function __construct()
    {
        echo "初始化成功","<br/>";
    }
    public function query(){
        echo "正在查询数据","<br/>";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值