php 脚本试图执行方法或访问不完整对象的属性

fykwrbwg  于 2023-02-28  发布在  PHP
关注(0)|答案(5)|浏览(174)

我得到一个错误,完整的错误是:

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

我使用session在其中存储cart对象,并在以后某个时候获取它。authnetCart基本上是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;
            }
        }
......

你可以在第1266行看到,代码不允许我访问它的方法。任何帮助都将不胜感激。谢谢

ffscu2ro

ffscu2ro1#

你需要include/require的php与您的类 * 之前 * session_start()一样

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

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

56lgkhnf2#

您的答案似乎在错误消息中。
在取消序列化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;
            }
        }
...
monwx1rj

monwx1rj3#

这里的其他答案没有一个能帮我解决这个问题。
在这个特定的例子中,我使用CodeIgniter并在导致错误的行之前添加以下任意一行:

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

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

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

没有解决问题。

我设法通过调用我访问Authnet_Class的类的构造中的类定义来解决这个问题。

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的属性之前)。

cpjpxq1n

cpjpxq1n4#

我不推荐这种技术,但是有一种方法可以绕过这个错误

if( get_class($myObject)=='__PHP_Incomplete_Class' )
    $myObject = unserialize(preg_replace('/^O:\d+:"[^"]++"/', 'O:'.strlen('MyClass').':"MyClass"', serialize($myObject)));

拥有一个良好的站点架构显然是正确的解决方案,但在问题解决之前,它可以暂时有所帮助

zd287kbt

zd287kbt5#

如果你使用的是带有前端控制器的MVC框架,那么你需要在session_start语句之前添加autoload语句:
[前控制器]

//Do this before session start because session has an object that will not work
// if the class has not been loaded already
require_once('vendor/autoload.php');

//Start a session AFTER autoloading
session_start();

相关问题