【问题标题】:Correct way to reference class\method in another file在另一个文件中引用类\方法的正确方法
【发布时间】:2020-12-09 22:45:56
【问题描述】:

我有这样设置的课程:

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);

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

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

【问题讨论】:

  • 你在使用composer吗?
  • 您是否启用了任何形式的类自动加载?
  • @El_Vanja - 是的,我已经编辑了原始帖子以显示我的自动加载代码。
  • @Lessmore - 是的,我正在使用 composer 加载一些外部包。
  • @zeropsi 尝试composer dump-autoload 然后再次测试

标签: php oop


【解决方案1】:

您还没有为您的类声明命名空间,因此尚不清楚它是否会以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 自动加载器,那么大多数此类问题都会消失。

【讨论】:

  • 感谢您的回复。理解混乱,如果我在我的ModelsAuth.php 文件中添加:namespace MVC\Model; use MVC\Model; class ModelsAuth extends Model {,那么我将如何从类外部调用然后调用函数?
  • 我对实现这一目标的正确方法仍然有些困惑。将 namespace 添加到 ModelsAuth 类后,尝试从类外部引用 validateToken 时仍然出现错误。
猜你喜欢
  • 2011-12-26
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多