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

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

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

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

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

Fatal error: Uncaught Error: Class 'My_Class' not found in C:\xampp\my-path-to-site\my-theme\functions.php

в \ my-site \ functions.php:

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

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

в \ my-site \ folder \ class.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 & fields
}

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

Warning: require(/setup/class.my-class.php): failed to open stream: No such file or directory in C:\xampp\htdocs\my-site\wordpress\wp-content\themes\my-theme\functions.php on line 29

Fatal error: require(): Failed opening required '/setup/class.my-class.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\my-site\wordpress\wp-content\themes\my-theme\functions.php on line 29

Ответы [ 2 ]

1 голос
/ 15 марта 2019

По сути, у вас нет правильного пути, и 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);
0 голосов
/ 15 марта 2019

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

в \ my-site \ folder \ class.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 & fields
}

in \ my-site \ functions.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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...