Фатальная ошибка: Класс не найден в

19 нояб. 2014 г., 17:47:10
Просмотры: 28.2K
Голосов: 2

Я работаю над плагином для 'подключения' дополнительного платежного провайдера в систему оформления заказа.

У меня есть класс gtpCheckoutData в моем файле function.php, который вычисляет цены.

В моем плагине я хочу использовать данные из этого класса gtpCheckoutData, но когда я делаю это, получаю:

Fatal error: Class gtpCheckoutData not found in

Код моего плагина:

class gtpMollieGateway {
   private $mollie, $price;

   function __construct() {
       $this->mollie    = new Mollie_API_Client;

       // ЭТО ПРОБЛЕМА
       $this->price     = new gtpCheckoutData;

       add_action( 'init', array( $this, 'gtpCreatePayment' ) );
   }

   function gtpCreatePayment() {
       if( isset( $_POST['checkout_submit'] ) ) {
           $payment     = $this->mollie->payments->create(array(
                'amount'        => $this->price->getPrice( 'inclusive' ),

           ));
           header( "Location: " . $payment->getPaymentUrl() );
       }
   }
}

Мой класс gtpCheckoutData в файле functions.php

class gtpCheckoutData {
    private $tax, $price;

    public function __construct() {
        $this->tax      = get_gtp_option( 'gtp_tax' ) / 100;
        $this->price    = $_SESSION['shopping_cart']['total_price'] + $_SESSION['shopping_cart']['shipping_price'];
        $this->shipping = $_SESSION['shopping_cart']['shipping_price'];
    }

    public function getPrice( $type ) {

        if( isset( $type ) ) {
            switch( $type ) {
                case 'exclusive' : 
                    $totalPrice = $this->price;
                    break;
                case 'tax' :
                    $totalPrice = $this->price * $this->tax;
                    break;  
                case 'inclusive' :
                    $totalPrice = $this->price * ( $this->tax + 1 );
                    break;
            }
            return $totalPrice;
        }
    }
}
0
Все ответы на вопрос 2
2

Плагины загружаются раньше тем. Самые ранние хуки, доступные для плагинов — это plugins_loaded (или muplugins_loaded для мультисайтовых плагинов), в то время как темы выполняются на хуке after_setup_theme и более поздних. Поэтому лучше просто загружать файл [содержащий класс] на определённом хуке в вашем плагине. Вероятно, оптимально загружать его с приоритетом ниже стандартного 10. Ниже я использую 5, чтобы сделать его доступным для колбэков, работающих со стандартным приоритетом. Это более безопасно для ваших пользователей, так как они могут не указывать приоритет, и тогда колбэк выполнится с 10, что снова вызовет ошибку.

add_action( 'after_setup_theme', function()
{
    require plugin_dir_path( __FILE__ ).'src/your-class.php`;
}, 5 );

Затем в файле functions.php вашей темы вы можете просто использовать класс. Это также исключает дублирование кода (и его поддержку в двух местах) и избавляет от ненужных проверок class_exists, которые просто снижают производительность. Кроме того, становится предсказуемым, где ваш класс доступен и готов к использованию.

Учтите, что текущий стандарт FIG PSR-4 не допускает более одного класса в файле (и ничего лишнего). Следование этому делает вашу настройку более устойчивой к будущим изменениям, так как ваш код готов к использованию пространств имён. (Текущая версия PHP — 5.6, а 5.3 уже не поддерживается).

19 нояб. 2014 г. 18:37:41
Комментарии

Спасибо за ваш отличный ответ! Единственная проблема, с которой я сталкиваюсь, это то, что функция get_gtp_option() создается в functions.php. Поэтому я снова получаю ошибку.

Robbert Robbert
19 нояб. 2014 г. 18:44:48

@Robbert Пожалуйста, обновите ваш вопрос с более подробной информацией и упомяните меня здесь, чтобы я мог полностью понять вашу проблему.

kaiser kaiser
19 нояб. 2014 г. 18:50:34
1

Плагины загружаются раньше, чем functions.php. По возможности, класс следует подключать в вашем плагине.

У меня были ситуации, когда класс был частью темы, но также требовался в плагине, где нельзя было гарантировать, что класс подключён в теме. В таких случаях я просто подключал класс в обоих местах, оборачивая его в проверку на существование класса.

Вот так:

if(!class_exists('My_Class'))
{
 class My_Class{

    // Методы и свойства класса
 }
}

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

19 нояб. 2014 г. 17:59:46
Комментарии

Без проблем. Как сказал Kaiser в своём ответе, необходимость поддерживать два отдельных файла одного и того же класса — не идеальное решение. Однако, если вы используете класс в других местах темы, вы не можете предполагать, что плагин установлен и активирован.

SkyShab SkyShab
19 нояб. 2014 г. 19:03:57