致命错误:未在中找到类

时间:2014-11-19 作者:Robbert

我正在开发一个插件,用于将额外的支付提供商“挂钩”到一个结账系统。

我的函数中有一个类gtpCheckoutData。计算价格的php。

在我的插件中,我想使用这个类中的数据,但如果这样做,我会得到:

Fatal error: Class gtpCheckoutData not found in

我的插件代码:

class gtpMollieGateway {
   private $mollie, $price;

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

       // THIS IS THE PROBLEM
       $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() );
       }
   }
}
函数中的My类。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;
        }
    }
}

2 个回复
最合适的回答,由SO网友:SkyShab 整理而成

插件在函数之前加载。php。如果可能的话,应该在插件中包含该类。

我曾经有过这样的场景:一个类是主题的一部分,但也需要一个插件,在这个插件中,你不能假设这个类包含在主题中。在这些情况下,我只需在两个位置都包含该类,并将其包装在“类存在”检查中。

像这样:

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

    // Class Methods and Properties
 }
}
您还可以在MU插件中只包含一次该类,它是在其他插件之前加载的。

SO网友:kaiser

插件在主题之前加载。插件可用的最早挂钩是plugins_loaded (或muplugins_loaded 对于mu插件),而主题在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 standard 不允许每个文件有多个类(除此之外没有其他类)。这样做可以让您的设置更加经得起未来的考验,因为您的代码已经准备好了命名空间。(当前的PHP版本是5.6,5.3已经过时)。

结束

相关推荐

Multisite and plugins options

我需要更多关于get_site_option(), update_site_option() 和add_site_option().在codex中,他们说它与单次安装相同,只是在多站点中,它返回网络范围的选项。好吧,但我对这一点感到困惑:这是否意味着一旦设置了网络范围选项,所有站点的选项都是相同的?还是每个站点都会覆盖它?我的意思是如果我这样做: update_site_option(\'option_group\', \'default_options());// default_options() r