* 一、定义命名空间
* 命名空间主要针对:类,函数和常量,因为他们的作用域是全局的,产生命名冲突的可能性很大
* 1. 关键字: namespace
* 作用:1. 定义命名空间; 2.显示的访问当前命名空间,类似于self;
* 2. 常量: __NAMESPACE__: 当前命名空间字符串,全局为空字符
* 3. 声明空间前不宜有除了declare之前的语句
namespace one;
//常量
const SITE = 'php是世界上最好的语言';
//函数
function house(){
return '我家在北京有套300平米的房子';
}
//类
class Hobby
{
public static $hobby = 'swim';
}
//空间魔术常量 __NAMESPACE__
echo '当前命名空间的名称是:'.__NAMESPACE__.'<br>';
//访问当前空间中的变量
//关键字:namespace 引入了当前空间
echo '站点名称:'.namespace\SITE.'<br>';
echo '站点名称:'.SITE.'<br>';
echo '哈哈哈'.namespace\Hobby::$hobby.'<br>';
//访问函数
echo '访问当前空间的函数:'.house().'<br>';
echo '访问当前空间的函数:'.namespace\house().'<br>';
echo '<hr>';
//可以在一个脚本中创建多个命名空间
namespace two;
const DOMAIN = 'www.zbdx.cn';
class User{
public static $name = 'admin';
}
echo '当前命名空间的名称是:'.__NAMESPACE__.'<br>';
echo '站点域名:'.namespace\DOMAIN.'<br>';
echo '站点名称'.\one\SITE.'<br>'; // 全局空间用 \ 类似于根
//非限定名称
echo User::$name.'<br>';
// 限定名称 (类似于全局)
echo \two\User::$name.'<br>';
//访问one中hobby的成员,一定要从全局开始: \
echo '我的爱好是:'.\one\Hobby::$hobby;
//echo '我的爱好是:'.one\Hobby::$hobby; //取不到值
//如何在当前的空间中,访问另一个空间中的成员呢?
//需要使用完整的命名空间名称: 完全限定空间,从全局空间开始,类似于文件根目录
//全局空间使用 : '\' 字符表示
注:
如何在一个脚本中声明多个命名空间
同一个脚本中,声明了多个命名空间
namespace first{
echo __NAMESPACE__.'<br>';
class A {
public static function index()
{
return '我的方法名是'.__METHOD__.'<br>';
}
}
function var_dump($name)
{
return '我叫'.$name;
}
echo var_dump('MJ'); //等价于 \first\var_dump()
echo \var_dump('MJ').'<br>'; //如果在var_dump()前面加上 \ 说明是调用的php函数,否则是自己定义的函数
}
namespace second{
echo __NAMESPACE__.'<br>';
class B{
public static function Metoo()
{
return '我在second中,我的方法名是'.__METHOD__.'<br>';
}
}
}
namespace {
class G
{
public static function Haaa()
{
return __METHOD__;
}
}
echo G::Haaa().'<br>';
echo __NAMESPACE__.'111'.'<br>'; //全局命名空间名字为空
echo first\A::index().'<br>'; //first前的 \ 可加可不加
//换个姿势
//使用关键字:namespace
echo namespace\first\A::index(), '<br>';
//使用魔术常量: __NAMESPACE__
echo __NAMESPACE__.\first\A::index(), '<br>';
echo first\var_dump('DonnieKing').'<br>';
}
注:
如何导入外部命名空间
/**
* 使用别名或引用,导入外部的完全限定名称
* 1.为外部的 "类" 使用别名
* 2.为外部导入的 "命名空间" 使用别名
* 3.导入空间或类别名,使用关键字:use
* 4.use 可同时导入多个空间或类,但推荐一个use 只导入一个
*
* 注意
* 1. 导入的空间必须是完全限定的,空间前不要添加:\
* 2. 导入并不是加载文件,当前脚本引用的外部文件仍要单独加载
* 3.
*
*/
//导入空间使用的关键字 use
namespace my_space;
require './public/User.php';
use model\User as modelUser; //导入空间别名,默认从全局开始,不需要再加 \
class User
{
}
echo \model\User::insert().'<br>'; //使用 \ 全局下的空间
echo modelUser::insert().'<br>';
//导入有空间名称的函数库,必须是php5.6+
require './public/func.php';
//导入公共函数库空间中的函数delete,并起一个短的别名: del
use function func_lib\delete as del;
echo del();