命名空间与Traits的使用

一、命名空间
使用场景:
一个大型的项目,由很多人来共同完成的,很多时候会出现类名重复的问题。

解决问题:
命名空间
1. 使用关键字 namespace 声明一个类,它的位置一定是要放在 整个脚本文件的前面,它的前面不能由输出。
2. 使用了命名空间的类的调用,必须在类名前 加上命名空间的值。
3. 可以使用 use 关键字,直接引入类。使用方法就是 use 关键字后面 接上 「命名空间\类名」
4. 使用命名空间中的别名,关键字是 as.

\index.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
<?php
error_reporting(null);
include('Test1.php');
include('Test2.php');

use App\Think\Test;
use App\Laravel\Test as LTest;

$obj1 = new App\Think\Test();                   // 实例化的是Test1中的Test类
$obj2 = new App\Laravel\Test();                 // 实例化的是Test2中的Test类
$obj3 = new Test();                             // 实例化的是Test1中的Test类
$obj4 = new LTest();                            // 实例化的是Test2中的Test类

\Test1.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App\Think;

class Test
{
    public function __construct($num1, $num2)
    {
        var_dump("这是Test1文件中的Test类");
    }
}

\Test2.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App\Laravel;

class Test
{
    public function __construct()
    {
        var_dump("这是Test2文件中的Test类");
    }
}

二、命名空间的使用
有3个同名的类文件,使用命名空间可以同时使用这些类文件。

\index.php

Select Code
1
2
3
4
5
6
7
8
9
<?php
include('./A.php');
include('./B.php');
include('./C.php');

// 访问 A 中的 getinfo() 方法
$obj1 = (new \App\Apple())->getInfo();
$obj2 = (new \Apple())->getInfo();
$obj2 = (new \C\Apple())->getInfo();

使用了命名空间的类的调用,必须在类名前 加上命名空间的值。

\A.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace App;

class Apple
{
    public function getInfo()
    {
        echo '这是A文件中的Apple<br>';
    }
}

\B.php

Select Code
1
2
3
4
5
6
7
8
9
<?php

class Apple
{
    public function getInfo()
    {
        echo '这是B文件中的Apple<br>';
    }
}

\C.php

Select Code
1
2
3
4
5
6
7
8
9
10
11
<?php

namespace C;

class Apple
{
    public function getInfo()
    {
        echo '这是C文件中的Apple<br>';
    }
}

三、Traits的使用
提高代码的可复用性

Select Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

trait OwnerTrait
{
    public function Owner()
    {
        echo "Article Owner";
    }
}

class Article
{
    use OwnerTrait;
}

class Comment
{
    public function Owner()
    {
        echo "Article Owner";
    }
}

(new Article())->Owner();
(new Comment())->Owner();