web-dev-qa-db-ja.com

致命的なエラー:クラスが見つかりません

私はチェックアウトシステムに追加の支払いプロバイダを「フックする」ためのプラグインに取り組んでいます。

私はfunction.phpに gtpCheckoutData というクラスを使って価格を計算します。

私のプラグインでは、この gtpCheckoutData クラスのデータを使用したいのですが、そうすると、次のようになります。

致命的なエラー:クラスgtpCheckoutDataが に見つかりません

私のプラグインコード:

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 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;
        }
    }
}
2
Robbert

プラグインはfunctions.phpの前にロードされます。可能であれば、プラグインにクラスを含めるべきです。

クラスがテーマの一部であるシナリオがありましたが、クラスがテーマに含まれていると想定できないプラグインでも必要でした。そのような場合は、両方の場所にそのクラスを含め、それを「クラスが存在する」チェックでラップします。

このような:

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

    // Class Methods and Properties
 }
}

他のプラグインの前にロードされるMUプラグインにクラスを一度だけ含めることもできます。

1
SkyShab

テーマの前にプラグインがロードされます。プラグインで利用可能な最も初期のフックはplugins_loaded(またはmu-pluginsの場合は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ファイルで、あなたはただクラスに頼ることができます。また、コードの重複(および2か所での維持)を避け、パフォーマンスを低下させるだけの不要なclass_existsチェックを必要としません。また、あなたのクラスが利用可能で使用準備ができている _であることも予測可能です。

現在の FIG PSR-4標準 では、ファイルごとに複数のクラスを使用することはできません(それ以外には何もありません)。あなたのコードは名前空間に対応しているので、これに従うことはあなたの設定をより将来の証拠にします。 (現在のPHPバージョンは5.6、5.3はサポート終了です)。

4
kaiser