web-dev-qa-db-ja.com

スクリプトがメソッドを実行しようとしたか、不完全なオブジェクトのプロパティにアクセスしようとしました

エラーが発生しています。完全なエラーは次のとおりです。

Fatal error: authnet_cart_process() [<a href='function.authnet-cart-process'>function.authnet-cart-process</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition &quot;AuthnetCart&quot; of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in /home/golfetc/public_html/wp-content/plugins/sccp-2.4.0/authnet_functions.php on line 1266

私はセッションを使用してカートオブジェクトを保存し、後でそれを取得します。 authnetCartは基本的にカートオブジェクトのクラスです。

// Check cart in session
    if(isset($_SESSION['AUTHNET_CART'])) {
        // Get cart from session
        $authnetCart = $_SESSION['AUTHNET_CART'];
        foreach($authnetCart->getCartItems() as $item) {  // Line#1266
            if ($item->getItemId() == $subscription_details->ID ) {
                $addNewItem = false;
                break;
            }
        }
......

1266行目を見るとわかるように、コードではメソッドにアクセスできません。どんな助けも大歓迎です。ありがとう

23
Irfan Dayan

クラスでinclude/requireを使用する必要があります[〜#〜] before [〜#〜]session_start() like

include PATH_TO_CLASS . 'AuthnetClassFilename.php';
session_start();

if (isset($_SESSION['AUTHNET_CART'])) {
    //...
}
40
Vladimir

あなたの答えはエラーメッセージにあるようです。

AUTHNET_CARTのシリアル化を解除する前に、それを定義するクラスを含めます。手動で、またはオートローダーを使用して。

include PATH_TO_CLASS . 'AuthnetClassFilename.php';

if(isset($_SESSION['AUTHNET_CART'])) {//...

実際にそれをシリアル化解除しているようにも見えません(セッションに詰め込む前にシリアル化されていると思いますか?)

if(isset($_SESSION['AUTHNET_CART'])) {
        // Get cart from session

        /** UNSERIALIZE **/
        $authnetCart = unserialize($_SESSION['AUTHNET_CART']);
        foreach($authnetCart->getCartItems() as $item) {  // Line#1266
            if ($item->getItemId() == $subscription_details->ID ) {
                $addNewItem = false;
                break;
            }
        }
...
3
Evil Buck

ここにある他の答えはどれも私にとって実際にこの問題を解決しませんでした。

この特定のケースでは、CodeIgniterを使用し、エラーの原因となった行の前に次の行のいずれかを追加していました。

 $this->load->model('Authnet_Class');

OR

 get_instance()->load->model('Authnet_Class')

OR

 include APPPATH . '/model/Authnet_Class.php';

notは問題を解決しました。

Authnet_Classにアクセスしていたクラスのconstructでクラス定義を呼び出すことで、それを解決することができました。つまり:

class MY_Current_Context_Class extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('Authnet_Class');
    }
    // somewhere below in another function I access Authnet_Class ...

Authnet_Classクラスにアクセスするコンテキストは、(Authnet_Classのプロパティを呼び出す直前だけでなく)コンテキストのクラス構成にその定義が存在する必要があることを理解しました。

0
CPHPython