紫郢青索

知之者不如好之者,好之者不如乐之者

用户工具

站点工具


PHP命名空间

理解命名空间

PHP命名空间,是为了解决在编程中遇到定义的类、函数、常量名称出现冲突的问题。

命名空间可以用操作系统的目录来理解:

在目录/home/zhansan/和目录/home/lisi/下都存在名字为demo.php的文件。

那么在其他目录要访问/home/zhangsan/目录下的文件就需要使用完整的目录来访问/home/zhangsan/demo.php

访问/home/lisi/目录下的demo.php,就需要使用/home/lisi/demo.php

这样就能明确的区分你要使用的文件了。

使用命名空间

对应到PHP的命名空间就是:

如果有两个文件中都定义了名为Demo的类,想要在一个文件中同时使用这两个Demo类,就会出现类名重复定义的错误。

引入命名空间就可以解决这样的类、函数、常量名称冲突的问题。

下面是使用命名空间来定义Demo类解决上面冲突问题的实例

有两个命名空间 home\zhangsanhome\lisi

在这两个命名空间下都有名称为Demo的类

定义代码如下: 命名空间 home\zhangsan

home_zhangsan_demo.php
<?php
namespace home\zhangsan;
 
class Demo{
    private $name = "Zhang San";
 
    public function __construct(){
 
    }
 
    public function getName(){
        return $this->name;
    }
}
 
?>

命名空间 home\lisi

home_lisi_demo.php
<?php
namespace home\lisi;
 
class Demo{
    private $name = "Li Si";
 
    public function __construct(){
 
    }
 
    public function getName(){
        return $this->name;
    }
}
 
?>

调用两个Dmoe

demo_1.php
<?php
require_once "home_zhangsan_demo.php";
require_once "home_lisi_demo.php";
 
$zhangsan = new \home\zhangsan\Demo();
$lisi = new \home\lisi\Demo();
 
echo $zhangsan->getName() . PHP_EOL;
echo $lisi->getName() . PHP_EOL;
?>

执行结果:

Zhang San
Li Si

另外一种写法使用 use 关键字,use as,表示把制定的命名空间定义别名。

demo_2.php
<?php
require_once "home_zhangsan_demo.php";
require_once "home_lisi_demo.php";
use \home\zhangsan\Demo as ZSDemo;
use \home\lisi\Demo as LSDemo;
 
$zhangsan = new ZSDemo();
$lisi = new LSDemo();
 
echo $zhangsan->getName() . PHP_EOL;
echo $lisi->getName() . PHP_EOL;
?>

执行结果:

Zhang San
Li Si

全局空间

如果没有定义命名空间,所有定义的函数、类都是全局空间的。 在名称前加上前缀 \ 表示该名称是全局空间中的名称。 在定义了命名空间 和 没有定义命名空间的文件中都可以这样使用。

例如,在没有定义命名空间中使用:

<?php
class Demo{
    private $name = "Li Si";
 
    public function __construct(){
 
    }
 
    public function getName(){
        $this->name = \str_replace(" ", "--", $this->name);
        return $this->name;
    }
}
 
$demo = new Demo();
echo $demo->getName();
echo PHP_EOL;
?>

\str_replace 表示使用的PHP全局方法。

例如,在定义命名空间中使用:

<?php
namespace home\lisi;
class Demo{
    private $name = "Li Si";
 
    public function __construct(){
 
    }
 
    public function getName(){
        $this->name = \str_replace(" ", "--", $this->name);
        return $this->name;
    }
}
 
$demo = new Demo();
echo $demo->getName();
echo PHP_EOL;
?>

\str_replace 表示使用的PHP全局方法。

重新定义PHP的函数

引入命名空间就可以在命名空间下定义和PHP预定义的函数重名的函数,因为PHP预定义函数属于全局空间。

例如:

<?php
namespace home\lisi;
 
function str_replace($search, $replace, $str){
    $str = \str_replace($search, $replace, $str);
    $str = "my_" . $str;
    return $str;
}
 
class Demo{
    private $name = "Li Si";
 
    public function __construct(){
 
    }
 
    public function getName(){
        // 调用全局
        $this->name = \str_replace(" ", "--", $this->name);
        // 调用该命名空间的
        $this->name = str_replace(" ", "--", $this->name);
        return $this->name;
    }
}
 
$demo = new Demo();
echo $demo->getName();
echo PHP_EOL;
?>

上面的例子中,分别调用了全局的PHP方法\str_replace(“ ”, “–”, $this→name);,和当前命名空间中定义的方法str_replace(“ ”, “–”, $this→name);

上面我们看到在调用不同文件中的类、方法时,首先使用了关键字 require_once,引入文件。 当我们学完了PHP的基础,总不能所有的程序都写到一个文件中,接下来我们学习PHP的程序文件的组织引用。

PHP文件包含