Вызов метода извне класса с зависимостями PHP - PullRequest
0 голосов
/ 24 августа 2018

Проблема: У меня есть index.php файл, который имеет несколько зависимостей композитора. Внутри файла index.php я пытаюсь вызвать статический метод из внешнего класса в другом файле php (скажем, auth.php), например:

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

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

Проблема заключается в том, что метод checkTime внутри класса также требует зависимости компоновщика, которая не наследуется, хотя файл находится в той же папке, что и index.php, и включен index.php.

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

Я перепробовал все - от добавления require_once / include 'index.php' до копирования автозагрузки композитора в auth.php снаружи и внутри кода AuthClass, но ничего не работает, я все еще получаю ту же ошибку.

Дополнительный код:

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

?>

Нужна помощь, ребята.

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Вы используете AuthClass до того, как оно было определено - попробуйте переместить строку include 'index.php'; в конец файла.

Вы также должны включить vendor/autoload.php только один раз - вам не нужно повторять это в каждом файле, просто убедитесь, что он включен вверху файла ввода, который обрабатывает запрос.

Но это больше похоже на проблему с дизайном.Вы должны определить AuthClass в отдельном файле и избегать каких-либо дополнительных побочных эффектов - файл должен определять только класс.Это является частью правил PSR-1 :

Файлы ДОЛЖНЫ либо объявлять символы (классы, функции, константы и т. Д.), Либо вызывать побочные эффекты (например, генерировать выходные данные, изменятьнастройки .ini и т. д.), но НЕ ДОЛЖНЫ выполнять оба действия.

Поскольку вы уже используете автозагрузчик из Composer, зарегистрировать собственные правила автозагрузки должно быть относительно легко, поэтому автозагрузчик Composer позаботится оавтозагрузка классов.

Если в этот момент вы все еще получаете Class 'X' not found, вы, вероятно, не установили какую-либо зависимость, или ваши правила автозагрузки неверны.

0 голосов
/ 24 августа 2018

Самое простое решение - включить собственный код в автозагрузку компоновщика. На сайте композитора рассказывается, как это сделать.

Вам не нужно запрашивать файлы композитора самостоятельно, а композитор все обрабатывает за вас.

PSR-4 сообщает вам, как использовать пространство имен в вашем коде для использования пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...