PHP基础—-命名空间全局成员的访问与use导入/别名
学习总结
命名空间的访问类似于系统文件管理的方式,根目录\
来表示,我们按照文件管理方式理解就可以了。
其次,特别要注意就是use
的导入并不能代替加载include
和require
,也就是说在使用use
之前,我们依然要加载其所在的脚本文件。
最后,use 默认导入 类、接口、方法,若要导入常量或函数,则需要添加相应的关键字 const
|function
。
当然,我们应该知道,全局成员是包括:类,接口,函数,常量;(不包含变量,因为变量是受到作用域限制,例如函数中的定义的变量,不能在外部访问);
更多说明在代码注释中…..请认真浏览哦 - - -_- !
示例目录
测试效果
app.php代码
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/10
* Time: 19:35
*/
/*
* 命名空间,需要PHP5.3+才能被支持(其参考了传统的目录管理文件的方式);
* 命名空间的功能:
* 1-规范了全局成员的声明与访问方式;
* 2-规范了全局成员的命名方式与命名冲突的解决方案;
* */
/*
* 常用术语
* 全局成员:类,接口,函数,常量;(不包含变量,因为变量是受到作用域限制,例如函数中的定义的变量,不能在外部访问)
* 全局空间:使用‘|’,表示根目录;
* 完全限定名称:是指从根空间检索全局成员,类似于文件管理的绝对路径概念;
* 限定名称:是指从当前空间检索全局成员,类似于文件管理的相对路径;
* 非限定名称:是指仅从当前空间检索全局成员,类似于文件管理的当前路径;
* */
/*
* 关键字
* namespaces,创建命名空间(必须位于代码的第一行),也可用于引用当前命名空间,类似于类中的'self';
* 魔术常量,__NAMESPACE__,__CLASS__,__METHOD__,内部存储的内容类型固定,但数据是变化的,并且由系统自身维护;
* __NAMESPACE__,返回一个包含当前命名空间名称的字符串;
* __CLASS__,返回一个包含当前类“完全限定名称”的字符串;
* __METHOD__,返回一个包含当前方法“完全限定名称”的字符串;
* __FUNCTION__,返回一个包含当前函数“完全限定名称”的字符串;
* ::class,返回具有“完全限定名”的类名;
* */
//创建命名空间
namespace application;
//引用文件 文件
require 'api.php';
require 'interface.php';
require 'config.php';
//root类
class root{
public $rootName;
public function get_root(){
$this->rootName=[
'namespace'=>__NAMESPACE__,
'classname'=>__CLASS__,
'method'=>__METHOD__
];
return$this->rootName;
}
}
//非限定名称-访问全局成员
echo '非限定名称-访问全局成员<br>';
$root=new root(); //等价于 $root=new namespace\root();
$array_root=$root->get_root();
echo '<pre>'.print_r($array_root).'</pre>';
echo '<hr>';
//限定名称-访问全局成员
echo '限定名称-访问全局成员<br>';
$api=new api\api_lie();
$api_str=$api->results();
echo $api_str;
echo '<hr>';
//完全限定名称-访问全局成员
echo '完全限定名称-访问全局成员**类<br>';
$name=new \application\root();
$array_root=$root->get_root();
echo '<pre>'.print_r($array_root).'</pre>';
echo '<hr>';
//完全限定名称-访问全局成员**常量
echo '完全限定名称-访问全局成员**常量<br>';
echo \application\config\SITE_NAME;
echo '<hr>';
//完全限定名称-访问全局成员**函数
echo '完全限定名称-访问全局成员**函数<br>';
echo \application\config\total(3.3,2);
echo '<hr>';
//完全限定名称-访问全局成员**接口
echo '完全限定名称-访问全局成员**接口<br>';
$inter=new \application\interfaces\registerInfo();
echo $inter->getRegisterID();
echo '<hr>';
//::class 可以解析/反射出类的“完全限定名称”;
$results=root::class;
echo $results;
//===================================================================
/*
* use 关键字的导入机制;
* use 导入,就是声明当前脚本中要使用到的全局成员(使用全局限定名称表示);
* 作用:解决当前脚本中冗长的 完全限定名称;
* 语法:use 全局成员的完全限定名称(因为 use 默认就是从全局开始,所以完全限定名称的`\`可以省略);
* 特别注意:
* 1-导入并不能等于加载,自然也就不能代替`include`|`require`;
* 2-use 默认导入 类、接口、方法,若要导入常量或函数,则需要添加相应的关键字 `const`|`function`;
* */
/*
* 导入的别名,是为了避免出现重名调用的问题;
* 如果不使用 as 赋予别名,那么use 引用的默认别名就是 `完全限定名称的类名 方法名 函数 常量名`;
* */
//use 导入常量
use const application\config\SITE_NAME as Const_site;
//use 导入函数 默认别名 是total
use function application\config\total;
//use 导入类
use application\api\api_lie;
//use 导入接口
use application\interfaces\iRegister;
echo '<br><br>===========use 导入机制==============<br>';
echo '输出常量:<br>';
echo Const_site;
echo '<hr>';
echo '输出函数结果:<br>';
$fun_total=total(8.9,6);
echo $fun_total;
echo '<hr>';
echo '输出引用类的名称:<br>';
$className=api_lie::class;
echo $className;
echo '<hr>';
echo '输出引用接口的名称:<br>';
echo iRegister::class;
echo '<hr>';
?>
api.php代码
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/10
* Time: 20:06
*/
/*
* api
* */
namespace application\api;
class api_lie{
public static $lie='这是一个静态属性';
public function results(){
return'api_lie_method(results)';
}
}
?>
interface.php代码
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/10
* Time: 20:06
*/
/*
* 接口类
* */
namespace application\interfaces;
//接口定义
interface iRegister{
public function getRegisterID();
}
//接口实现
class registerInfo implements iRegister{
public $RegisterID=1017;
public function getRegisterID()
{
// TODO: Implement getRegisterID() method.
return '注册ID:'.$this->RegisterID;
}
}
?>
config.php代码
<?php
/**
* Created by PhpStorm.
* User: Air15_2019
* Date: 2020/2/10
* Time: 20:41
*/
/*
* 配置文件config
* */
namespace application\config;
//站点名称
const SITE_NAME='这是一个常量!';
//函数
function total(float $price,int $number):float {
return $price*$number;
}
?>
Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:use 本质上是将完全限定名称成员转为非限定名称,但是在当前空间中默认成员就是非限定命名,所以很可能会命名冲突, 于是就有了别名处理机制. 除了用别名, 还可以用use将完全限定名称转为限定名称也可以避免冲突, 但显然没有别名来得优雅