Пространства имен и расширенные классы - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в пространствах имен и хочу понять, почему мой код не работает должным образом.У меня есть базовый класс аутентификации, основанный на базовой модели для пользователей:

<?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
    }
}

Для проекта, использующего это ядро, мне нужно изменить модель пользователей, и поэтому я расширил класс базовой аутентификации:

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

class Auth extends Base {}

Но при создании экземпляра класса \App\Auth\Auth кажется, что он использует \Core\Models\Users вместо \App\Models\Users.В чем проблема?

1 Ответ

0 голосов
/ 12 февраля 2019

Да, действительно, вы не можете переопределить псевдоним пространства имен в другом файле.

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 действительны только в пределах файла, в котором они написаныВы наверняка не сможете переопределить псевдонимы другого файла.В противном случае вы не могли бы доверять ни одному коду, который вы пишете в каком-либо файле, из-за потенциальной возможности столкновения имен, чего и пытаются избежать пространства имен.

...