PHP命名空间和访问方式

PHP命名空间是很神奇的,了解命名空间就等于了解了PHP面向框架的方法。
了解这个知识具体做什么用?学会了自然ThinkPHP、CI、Laravel等框架就好理解了。
官方文档已经说得很详细 [查看]
随意在PHP环境上创建index.php文件:

<?php
function china(){
    echo "中国";
}
china();

浏览器运行,正常显示中国。如果我放多个函数呢?

<?php
function china(){
    echo "中国";
}
function china(){
    echo "中国上海";
}
china();

会出现无法重新定义函数的错误,所以给函数外增加个命名空间namespace

<?php
namespace china;
function china(){
    echo "中国";
}
namespace shanghai;
function china(){
    echo "中国上海";
}

china();

得出中国上海,很正常。但是我想要第一个函数输出怎么办?
给china()增加个斜杠

<?php
namespace china;
function china(){
    echo "中国";
}
namespace shanghai;
function china(){
    echo "中国上海";
}

\china\china();

得到第一个中国。那么我给增加两个定义常亮:

<?php
namespace china;
define("name","定义中国");

namespace shanghai;
define("name","定义中国上海");

echo name;

发现还是报错,常亮已有定义的,怎么办?用const来定义常亮:

<?php
namespace china;
const name = "中国";

namespace shanghai;
const name = "定义中国上海";

echo name;
echo \china\name;

没问题,对const常亮是有效的,那么创建个CLASS类访问方法:

<?php
namespace china;
class China{
   public $db = "中国2020";
   static $name = "全面小康";
}

namespace shanghai;
class China{
   public $db = "中国上海2020";
   static $name = "上海是中国最领先的城市";
}

$china = new China();
echo $china->db;   //访问 Class China类下的$db
echo China::$name;  //访问 Class China类下的$name

同样,需要访问第一个类还是加上斜杠

$china = new \china\China();
echo $china->db;  
echo \china\China::$name;  

感觉斜杠指定写法比较繁琐,很多控制器index\controller\home比较长,所改用use方法:

<?php
namespace index\controller\home;
class China{
   public $db = "中国2020";
   static $name = "全面小康";
}

namespace index\controller\admin;
class China{
   public $db = "中国上海2020";
   static $name = "上海是中国最领先的城市";
}

use index\controller\home; //引用空间

$china = new China();  
echo $china->db;
echo China::$name;

$china = new home\China();   //访问第一个类值
echo $china->db;   //访问第一个类值
echo home\China::$name;    //访问第一个类值

把类加进引namespace里更方便:

<?php
namespace index\controller\home;
class China{
   public $db = "中国2020";
   static $name = "全面小康";
}

use index\controller\home\China;  //把china类引用空间

$china = new China();
echo $china->db;
echo China::$name;

感觉是不是很简单?


© 2020 www.f-learn.cn All Rights Reserved