首页 > 解决方案 > 在另一个文件中引用类\方法的正确方法

问题描述

我有这样设置的课程:

use MVC\Model;
use \Firebase\JWT\JWT;

class ModelsAuth extends Model {

在我的ModelsAuth课堂上,我有这个成员函数:

public function validateToken($token) {
}

我正在使用它来自动加载我的课程:

// autoload class
function autoload($class) {
    // set file class
    $file = SYSTEM . str_replace('\\', '/', $class) . '.php';

    if (file_exists($file))
        require_once $file;
    else
        throw new Exception(sprintf('Class { %s } Not Found!', $class));
}

// set autoload function
spl_autoload_register('autoload');

是否可以从类外调用这个类和函数?

我努力了:

$authorization = new \MVC\Model\ModelsAuth();
$authorization->validateToken($token);

$authorization = MVC\Model\ModelsAuth::validateToken($token);

两者都返回一个类未找到错误。

有什么想法我可能用这种方法做错了吗?

标签: phpoop

解决方案


你还没有为你的类声明一个命名空间,所以不清楚它是否会存在MVC\Model\ModelsAuth,它可能只是作为\ModelsAuth. 你可能想要这样的东西:

namespace MVC\Model;

class ModelsAuth extends \MVC\Model {
    ...
}

也可以指定为:

namespace MVC\Model;

use MVC\Model;

class ModelsAuth extends Model {
    ...
}

但是,我不喜欢这些选项中的任何一个,因为这样您就有了一个名为的基类\MVC\Model和一个名为 的命名空间\MVC\Model,这有点令人困惑。我建议将您的基类作为抽象放入\MVC\Model命名空间中,在一个如下命名的文件中MVC/Model/AbstractModel.php

namespace MVC\Model;

abstract class AbstractModel {
    ...
}

然后你的模型在一个MVC/Model/MyModel.php像这样的文件名中:

namespace MVC\Model;

class MyModel extends AbstractModel {
    ...
}

这样,您的所有模型都在同一个命名空间和同一个目录中。

此外,如果您使用PSR-4自动加载器,那么大多数此类问题都会消失。


推荐阅读