Получение сообщения об ошибке «класс не найден» при создании объекта в другом файле PHP

#php #wordpress

#php #wordpress

Вопрос:

Я новичок в WordPress и PHP, и я пытаюсь добавить страницу пользовательских настроек в свою тему WordPress, определив класс, который используется для создания страницы. Когда я пытаюсь создать объект в functions.php файл для создания страницы, я получаю сообщение об ошибке, в котором говорится, что класс не может быть найден.

Я потратил некоторое время на поиск решений и возился с кодом, но не смог найти ничего, что работает. Файл определенно существует (я могу найти его в указанном месте в проводнике файлов и открыть / отредактировать его в моей IDE). Если я просто вставлю код из моего файла класса непосредственно в functions.php после удаления объявления класса и конструктора все работает, как ожидалось.

Я запускаю XAMPP в Windows.

Сообщение об ошибке:

 Fatal error: Uncaught Error: Class 'My_Class' not found in C:xamppmy-path-to-sitemy-themefunctions.php
  

в my-sitefunctions.php:

 include('/folder/class.my-class.php');

$my_options = new My_Class;
$my_options->__construct();
  

в my-sitefolderclass.my-class.php:

 class My_Class
{
    private $options;

    function __construct() {
        add_action( 'admin_menu', array($this, 'option_add_admin_menu'));
        add_action( 'admin_init', array($this, 'option_settings_init'));
    }

    function option_add_admin_menu(  ) { 
        add_options_page('My Options', 'Options', 'manage_options', 
        'options', array($this, 'option_options_page');
    }

    // rest of code that registers settings amp; fields
}
  

РЕДАКТИРОВАТЬ: я изменил «include():» на «require()», как предлагалось, но теперь я получаю два разных сообщения об ошибках:

 Warning: require(/setup/class.my-class.php): failed to open stream: No such file or directory in C:xampphtdocsmy-sitewordpresswp-contentthemesmy-themefunctions.php on line 29

Fatal error: require(): Failed opening required '/setup/class.my-class.php' (include_path='C:xamppphpPEAR') in C:xampphtdocsmy-sitewordpresswp-contentthemesmy-themefunctions.php on line 29
  

Комментарии:

1. Подсказка: попробуйте изменить include('/folder/class.my-class.php') на require('/folder/class.my-class.php')

2. В методе option_add_admin_menu My_Class ошибка. отсутствует «)» в конце вызова метода add_options_page().

3. Я только что попробовал это. Больше не отображается ошибка, описанная выше, но теперь есть две разные ошибки. «не удалось открыть поток: нет такого файла или каталога» и «require(): требуется неудачное открытие»

4. В чем заключаются ошибки?

5. Эдуардо Джуниор — Хороший улов. Я добавил «)». В сообщениях об ошибках ничего не изменилось.

Ответ №1:

Фактически, у вас нет правильного пути, который include позволит вам продолжить, если файл не существует.

При включении или запросе файла, если указанный вами путь начинается с / или , PHP будет рассматривать его как путь из корня текущей файловой системы. Когда вы указываете путь, который не начинается с одного из этих файлов, PHP считает, что это относительный путь, и попытается угадать, какой файл включить, основываясь на том, где находится текущий файл и другие каталоги, о которых он знает.

Для исправления вы, вероятно, захотите выполнить следующее:

 require_once __DIR__.'/folder/class.my-class.php';
  

Смотрите документы по include , include_once и, а также __DIR__ .

Рекомендация:

При каждом включении файла вы должны пытаться использовать require_once по возможности. Если вы знаете, что этот файл может включаться несколько раз, тогда вы можете использовать require . Если это файл, который можно опустить, если он по какой-либо причине не существует, тогда вы можете использовать include_once . Если файл может быть обоими, только тогда вы должны использовать include .

Однако, как опытный программист, я также могу сказать вам, что если вы используете либо include_once , либо include вы делаете что-то неправильно и должны проверить, существует ли файл, прежде чем пытаться включить его вслепую.

Кроме того, я настоятельно рекомендую постоянно использовать приведенный ниже код. Это поможет вам отлавливать ошибки взлома до того, как у них появится шанс на самом деле сломаться. Или, по крайней мере, даст вам лучшее понимание того, почему что-то сломалось.

 ini_set('display_errors', '1');
error_reporting(-1);
  

Комментарии:

1. Это сработало, спасибо за вашу помощь! Я обязательно прочитаю соответствующие документы.

Ответ №2:

Пожалуйста, проверьте мои комментарии внутри кода

в my-sitefolderclass.my-class.php:

 <?php

class My_Class
{
    private $options; //if you want receive a option

    function __construct($options) { //You need receive this option here

        $this->options = $options; //and atribut it here

        //add_action( 'admin_menu', array($this, 'option_add_admin_menu'));
        //add_action( 'admin_init', array($this, 'option_settings_init'));
    }

    function option_add_admin_menu() { 
        //add_options_page('My Options', 'Options', 'manage_options', 
        //'options', array($this, 'option_options_page');
    }

    // rest of code that registers settings amp; fields
}
  

в my-sitefunctions.php:

     <?php

    include_once('folder/class.my-class.php'); //removed the root bar

    //You are waiting for a option in the class, so pass this option
    $my_options = new My_Class('some option'); 

    //$my_options->__construct(); //You don't need this here, the constructor is used inside the class.