Получение ошибки с использованием $ this, когда отсутствует в контексте объекта, для всех методов класса, кроме метода __construct () - PullRequest
1 голос
/ 29 апреля 2020

У меня есть два класса в отдельных файлах. Имена классов и файлов: Заменить. php и Модели. php. У меня есть некоторые свойства в классе Substitute. php, к которым я могу получить доступ, используя $this->property_name в методе __construct() без каких-либо ошибок. Однако, когда я пытаюсь получить доступ к тому же свойству в другом методе (метод test() в моем случае (см. Код ниже)) в того же класса (т. е. класс Substitute). Я получаю сообщение об ошибке. Неустранимая ошибка: Uncaught Error: Использование $ this, когда отсутствует в контексте объекта в G: \ ROHAN \ eTh0 \ VectorVolunteers \ vector \ backend \ models \ Substitute. php: 22 . Строка 22 - echo $this->c_day; в методе sss() (я сократил часть кода в классе, добавив только тот, который я считал релевантным, я добавлю остальную часть кода на случай, если кому-то понадобится). Я получаю доступ к методам sss() и test() из URL-адреса по autoloader method и class Router, которые я включил также ниже: ниже этой строки находится код внутри замены. php: EDIT1: я добавил другой метод из замены класс, где также я получаю ту же ошибку.

class Substitute extends Models{
    public $user_id, $c_day, $c_date;
    public function __construct(){
        $_SESSION['username']='user2';
        echo 'constructor in class Substitute ran';
        $this->user_id = $this->get_user_id();
        $this->c_day = $this->upcoming_class();
    }
    public function sss(){
        echo $this->c_day;
    }
    public function test(){        
        if(isset($_POST['select_class_subs'])){
            switch ($_POST['select_class_subs']) {
                case 'Next Class':
                    $this->c_date = date('d-M-yy', strtotime(($this->c_day)));
                    break;

                case 'Next-to-next Class':
                    $this->c_date = date('d-M-yy', strtotime(($this->c_day . '+1 week')));
                    break;

                default:
                    echo 'Custom class selected <br>';
                    break;
            }
            if($this->c_date==date('d-M-yy')){
                echo "Sorry, but you cannot post a substitute request for a class that is scheduled to happen on the same day. <br>";
            }
            else{
                echo "Done! <br>";
            }
        }
    }

EDIT2: код в файле config. php, который требуется в методе autoloader() (см. ниже):

if(isset($_GET['url'])){$url = explode('/', $_GET['url']);}
require_once (ROOT . DS . 'backend' . DS . 'bootstrap.php');

EDIT2: код файла bootstrap. php, который имеет autloader() метод:

require_once 'config.php';

// Autoloader for classes
spl_autoload_register('autoloader');
function autoloader($class_Name){
    if (file_exists (ROOT . DS . 'backend' . DS .'core' . DS . $class_Name . '.php')){
        require_once (ROOT . DS . 'backend' . DS . 'core' . DS . $class_Name . '.php');
    }
    elseif (file_exists (ROOT . DS . 'backend' . DS .'models' . DS . $class_Name . '.php')){
        require_once (ROOT . DS . 'backend' . DS . 'models' . DS . $class_Name . '.php');
    }
    elseif (file_exists(ROOT . DS . 'backend' . DS .'views' . DS . $class_Name . '.php')){
        require_once (ROOT . DS . 'backend' . DS . 'views' . DS . $class_Name . '.php');
    }
    elseif (file_exists(ROOT . DS . 'backend' . DS .'controllers' . DS . $class_Name . '.php')){
        require_once (ROOT . DS . 'backend' . DS . 'controllers' . DS . $class_Name . '.php');
    }
    elseif (file_exists(ROOT . DS . 'backend' . DS .'database' . DS . $class_Name . '.php')) {
        require_once (ROOT . DS . 'backend' . DS .'database' . DS . $class_Name . '.php');
    }
    elseif (file_exists(ROOT . DS . 'backend' . DS .'reminders' . DS . $class_Name . '.php')) {
        require_once (ROOT . DS . 'backend' . DS .'reminders' . DS . $class_Name . '.php');
    }
    else {echo 'Class does not exist or Class file not found' . '<br>';}
}

// Route the request to router.php
if (isset($_GET['url'])) {
Router::route($url);
}

EDIT2: код в файле который содержит class Router{}:

class Router{
  private static $controller_name, $method_name;
  public static function route($url){
      if (isset($url[0]) && $url[0] != "") {
        $controller = ucwords($url[0]);
        self::$controller_name = $controller;
        array_shift($url);
      }
      if (isset($url[0]) && $url[0] != "") {
        $method =  ucwords($url[0]);
        self::$method_name = $method;
        array_shift($url);
      }

      $params = $url;

      $init = new self::$controller_name;

      if (method_exists(self::$controller_name, self::$method_name)){
          call_user_func_array([self::$controller_name, self::$method_name], $params);
      }
      else{
        if(self::$method_name!=NULL){
          echo 'The requested method "' . self::$method_name . '" does not exist in ' . '"' . self::$controller_name . '" controller.';
        }
      }
  }

Ниже приведен код внутри Моделей. php (Я включил его на случай, если кто-то потребует. Но знайте, что я расширил этот класс на многие другие классы и все из методов в этом классе работают нормально без каких-либо ошибок или предупреждений).

class Models extends Database {
private $db, $user_id, $table, $rv_id_table_name, $av_id_table_name, $class_day;
    protected function get_user_id(){
        if (isset($_SESSION['username'])){
            $username=$_SESSION['username'];
            $sql = 'SELECT * FROM volunteers where username=:username';
            $params = [
                'username' => $username
            ];
            $array = $this->query($sql, $params);
            $this->user_id = $array['id'];
            return $this->user_id;
        }
        else{
            echo 'You are not signed in.' . '<br>' . 'Please sign in first.';
        }
    }
    protected function upcoming_class(){
        if (isset($_SESSION['username'])) {
            $id = $this->get_user_id();
            $params = [
                'id' => $id
            ];
            $sql = 'SELECT class_day FROM volunteers where id=:id';
            $this->class_day = $this->query($sql, $params);
            return $this->class_day['class_day'];
        }
    }

Я хочу знать, почему я получаю вышеупомянутую ошибку (курсивом) и как ее устранить. Я спросил об этом, потому что пытался со вчерашнего дня, но безуспешно.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Как вы используете этот метод (sss)? Вы случайно не называете это статически:

Substitute::sss();

Если это так, вот почему у вас возникла проблема. Метод не является c. Это должно быть названо так (в качестве одного примера):

$object = new Substitute();
$object->sss();
0 голосов
/ 29 апреля 2020

Я попытался преобразовать свойства $c_day и $c_date из class Substitute{} из public в public static, и вместо использования $this-> к вышеуказанным свойствам я использовал self:: в методах public function sss() и public function test() и к моему удивлению это работает. Больше ошибок нет.

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