【问题标题】:Calling a method from outside class with dependencies PHP从外部类调用具有依赖项 PHP 的方法
【发布时间】:2019-01-30 22:37:48
【问题描述】:

问题: 我有一个 index.php 文件,它有几个作曲家依赖项。 在index.php 文件中,我试图在不同的php(比如说auth.php)文件中从外部类调用静态方法,如下所示:

/*creating a class instance*/
$var = new AuthClass();

/*accessing an outside class method*/
$var = AuthClass::checkTime($tokenCode);

问题是类中的 checkTime 方法也需要一个 composer 依赖项,虽然该文件与 index.php 位于同一文件夹中并且包含 index.php,但该文件不被继承。

PHP Fatal error:  Uncaught Error: Class 'Token' not found

我已经尝试了所有方法 - 从添加 require_once/include 'index.php' 到将 composer autoload 复制到 AuthClass 代码内外的 auth.php,但没有任何效果,我仍然遇到同样的错误。

附加代码:

index.php

require __DIR__ . '/src/vendor/autoload.php';

$argument1 = $_GET['argument1'];
$tokenCode = $_GET['tokenCode'];

include 'config/database.php';
include 'objects/program1.php';
include 'auth.php';

use ReallySimpleJWT\Token;
use Carbon\Carbon;

$secret = "somesecret";

if (($_SERVER['REQUEST_METHOD']) == "GET") {

    if ($_GET['url'] == "bankquery") {

        if($tokenCode===NULL){
            echo "no correct token provided";
            print($results);
        } else {
        $results = Token::validate($tokenCode, $secret);
        if ($results = 1){

$var = new AuthClass();
$var = AuthClass::checkTime($tokenCode);

} else {
    echo "no correct token provided";
}
    }

} else {
    echo "some GET other query";
}

?>

auth.php

// loading composer
require __DIR__ . '/src/vendor/autoload.php';

//loading my index.php file
include 'index.php';

//using composer dependencies
use ReallySimpleJWT\Token;
use Carbon\Carbon;

class AuthClass{

public static function checkTime($tokenCode){

// getting payload from token code by accessing the composer dependency method in a class Token
$received = Token::getPayload($tokenCode);

return $received;
}
}

?>

需要帮助,伙计们。

【问题讨论】:

  • 没有足够的信息。请提供一些关于 Token 类的信息
  • @DavitHuroyan 提供了代码
  • 在 Token " \Token" 之前尝试 \ 或尝试使用命名空间让我们看看会返回什么
  • 那么index.php的内容是什么?
  • 尝试了 "\Token" 和命名空间 "ReallySimpleJWT\Token" 都没有工作,同样的错误,不幸的是@DavitHuroyan

标签: php class dependencies composer-php


【解决方案1】:

您在定义之前使用AuthClass - 尝试在文件末尾移动include 'index.php'; 行。

您还应该只包含一次vendor/autoload.php - 您不需要在每个文件中重复此操作,只需确保它包含在处理请求的入口文件的顶部即可。

但这更像是设计问题的结果。您应该在单独的文件中定义 AuthClass 并避免其中的任何其他副作用 - 文件应该只定义类。这是PSR-1 rules的一部分:

文件应该声明符号(类、函数、常量等) 或引起副作用(例如生成输出、更改 .ini 设置等) 但不应该两者都做。

由于您已经在使用 Composer 的自动加载器,因此注册自己的自动加载规则应该相对容易,因此 Composer 的自动加载器将负责类的自动加载。

如果此时您仍然收到 Class 'X' not found,您可能没有安装某些依赖项或您的自动加载规则不正确。

【讨论】:

    【解决方案2】:

    最简单的解决方案是在作曲家自动加载中包含您自己的代码。 composer website 告诉你怎么做。

    您不需要自己要求作曲家文件,作曲家会为您处理一切。

    PSR-4 告诉您如何命名代码以使用命名空间。

    【讨论】:

    • 我为 composer.json 添加了 PSR-4 规则,以将我的 AuthSpace 空间名与 AuthClass 链接,转储自动加载 - 它生成了新的 psr-4 自动加载文件 - 但在执行 index.php 之后,现在是真正的 SimpleJWT\令牌不可用。我假设 composer.json 中的 require 和 PSR-4 是专有的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多