web-dev-qa-db-fra.com

Le script a essayé d'exécuter une méthode ou d'accéder à une propriété d'un objet incomplet

Je reçois une erreur, l'erreur complète est:

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

J'utilise session pour stocker un objet panier et le récupérer plus tard à un moment donné. AuthnetCart est fondamentalement une classe pour un objet cart.

// 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;
            }
        }
......

Vous pouvez voir à la ligne 1266, le code ne me permet pas d'accéder à sa méthode. Toute aide sera grandement appréciée. Merci

22
Irfan Dayan

Vous devez include/require le php avec votre classeAVANTsession_start() like

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

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

Il semble que votre réponse soit dans le message d'erreur. 

Avant de désérialiser AUTHNET_CART, incluez la classe qui la définit. Soit manuellement, soit en utilisant un autochargeur.

include PATH_TO_CLASS . 'AuthnetClassFilename.php';

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

Il ne semble pas non plus que vous le désérialisiez (je suppose que cela a été sérialisé avant de l'insérer dans la session?)

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

Aucune des autres réponses ici ne résout réellement ce problème pour moi.

Dans ce cas particulier, j'utilisais CodeIgniter et ajoutais l'une des lignes suivantes avant la ligne à l'origine de l'erreur:

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

OR

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

OR

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

Est-ce que pas n'a pas résolu le problème?.

J'ai réussi à le résoudre en appelant la définition de la classe dans le construct de la classe où j'accédais à Authnet_Class. C'est à dire.:

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 ...

Je comprends maintenant que le contexte dans lequel vous accédez à la classe Authnet_Class doit avoir sa définition présente dans la construction de classe du contexte (et pas juste avant d'appeler les propriétés de Authnet_Class).

0
CPHPython