1. 程式人生 > >php中名稱空間詳解

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();