PHP namespace 和 use

一、使用namespace的目的

简单一句话: 防止类冲突

为什么会 类冲突?
    团队合作的项目中或个人项目中,有可能会建一些相同的类,当同事导入相同类文件时,此时new 一下就会产生error的错误

二、namespace的使用方法

  • 1、namespace后命名的定义不区分大小写
namespace one 
namespace One 
namespace ONE
  • 2、没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠,也可以不加。

    • person.php
    class person
    {
        function __construct()
        {
            echo 'this is person';
        }
    }
    
    • index.php
        require_once('./person.php');
        new person();   // this is person
        // new \person();  // this is person
    
  • 3、new类时,带上命名空间时,之间一定用反斜杠字符,而不是顺斜杠。

    • person.php
    namespace App;
    class person
    {
        function __construct()
        {
            echo 'this is person';
        }
    }
    
    • index.php
        require_once('./person.php');
        new \App\person();    // 记住是反斜杠 App 前面可以不用加反斜杠
    
  • 4、命名空间声明后的代码便属于这个命名空间,即使有include或require也不影响(重点是对后半句的理解,具体看代码)。

    • dog.php
    namespace Animal;
    
    class dog
    {
        public function __construct()
        {
               echo 'this is dog';
         }
    }
    
    • person/person.php
    namespace person;
    require_once('../dog.php');
    
    new \Animal\dog();  // Animal 前必须加反斜杠,如果不加的话就会变成person\Animal\dog  ,因为Animal\dog 不属于person命令空间下
    // new dog();  // error  因为 person 下没有dog 类
    
    
  • 5、同命名空间下,类的使用可以省略一部分命令空间前缀

    • cat.php
    namespace Animal;
    
    class cat
    {
    	public function __construct(){
    		echo 'this is cat';
    	}
    }
    
    • index.php
    namespace Animal;
    
    require_once('./cat.php');
    new cat();                   // 省略了\Animal    因为在同一个命名空间下
    // new \Animal\cat()   //
    
  • 六、一个php文件可以有多个namespace

    namespace test;
    echo 'zhai14';
    namespace zhai;
    require './1.php';
    

三 使用use的目的:

    在命名空间字符串过长时,使用use可以相应的缩短命名空间    

四、如何使用use

  • 使用 use 导入类

    • animal/dog.php
    namespace Animal;
    
    class dog
    {
    	function __construct(){
    		echo 'this is dog';
    	}
    }
    
    
    • index.php
    require_once('./animal/dog.php'); // 加载php文件
    
    use Animal\dog; // 导入dog 类
    
    new dog();
    
  • 使用use 重命名类

    • index.php
    require_once('./animal/dog.php');
    
    use Animal\dog as cat ;
    
    new cat();
    
  • 使用use 导入类,方法,常量

// PHP 7 之前版本需要使用多次 use 
use some\namespace\ClassA; 
use some\namespace\ClassB; 
use some\namespace\ClassC as C; 

use function some\namespace\fn_a; 
use function some\namespace\fn_b; 
use function some\namespace\fn_c; 

use const some\namespace\ConstA; 
use const some\namespace\ConstB; 
use const some\namespace\ConstC; 

// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类 
use some\namespace\{ClassA, ClassB, ClassC as C}; 
use function some\namespace\{fn_a, fn_b, fn_c}; 
use const some\namespace\{ConstA, ConstB, ConstC}; 

五、总结

  • namespace
为了防止类,方法,常量的冲突,将这些冲突的类,方法,常量划分到不同名称空间中,这样在use 使用时就不会产生冲突了

  • use 使用的总结
1、在use 前 必须先导入 你需要使用类的文件
2、必须确保导入的文件是有namespace的,否则不能使用use
3、可对使用的类,方法,常量重命名
  • 导入文件
想要使用另一个php文件的代码,就必须先加载导入文件,才可以使用,上面我们都通过require_once 导入文件的,
其实可以使用php 内置函数 spl_autoload_register,自动加载文件,无需手动加载。当然规则要写好,每次use 带入类时都会自动先加载文件的。
posted @ 2019-06-13 17:18  xiaobaiskill  阅读(219)  评论(0)    收藏  举报