命名空间和扩展 类

Namespaces and extended classes

我是命名空间的新手,想了解为什么我的代码无法按预期工作。我有一个基本身份验证 class 依赖于用户的核心模型:

<?php
namespace Core\Auth;
use Core\Component;
use Core\Models\Users;

class Auth extends Component {
    public function __construct($options) {
        // do something
    }

    public function login($email, $password) {
        $user = Users::findByEmail($email);
        // do a lot more
    }
}

对于使用这个核心的项目,我必须修改用户模型,因此我扩展了核心身份验证class:

<?php
namespace App\Auth;
use Core\Auth\Auth as Base;
use App\Models\Users;

class Auth extends Base {}

但是在实例化 class \App\Auth\Auth 时,它似乎使用 \Core\Models\Users 而不是 \App\Models\Users。 有什么问题?

是的,的确,您不能覆盖另一个文件中的命名空间别名。

use 语句只建立别名。他们不加载代码或其他任何东西。

use Core\Models\Users;

...

public function login($email, $password) {
    $user = Users::findByEmail($email);
}

这完全等同于:

public function login($email, $password) {
    $user = \Core\Models\Users::findByEmail($email);
}

use 别名仅在写入它们的文件中有效。您当然不能覆盖另一个文件的别名。否则,由于名称冲突的可能性,您无法信任您在任何文件中编写的任何代码,而这正是命名空间试图避免的。