php中命名空间详解

 * 一、定义命名空间
 * 命名空间主要针对:类,函数和常量,因为他们的作用域是全局的,产生命名冲突的可能性很大
 * 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();

猜你喜欢

转载自blog.csdn.net/qq_36672905/article/details/84678525