防止不完整的php对象

时间:2015-08-30 19:14:46

标签: php oop session

我正在使用MVC pattren并在Controller类的构造中启动会话。 我的类(期望核心的一个)由spl_autoload_register()加载。 我创建一个AJAX类,它是Controller的子类,以防止用户在短时间内执行多个ajax请求我使用以下代码

class ajax extends Controller
{

    public function __construct()
    {
        parent::__construct(false);
        if ($this->checkAttempts())
            exit();   
    }

    public function checkAttempts()
    {
        $counter = 0;
        $attempts = Session::get(AJAX);
        $attempts = ($attempts === false) ? [] : $attempts;
        if ($attempts === false)
            Session::set(AJAX, []);
        else
            $this->setAttempt();
        foreach ($attempts as $key => $attempt)
        {
            if (time() - intval($attempt) <= 10)
                $counter++;
            else
                Session::destroyArray(AJAX, $key);
        }
        return $counter >= 5;
    }

    public function setAttempt()
    {
        return Session::setArray(AJAX, time());
   }

   //ajax methods ...
 }
问题是我打开另一个控制器,如家(没有构造)

class home extends Controller {
    public function index(){...}
}

脚本初始化ajax类的checkAttepmt方法中的会话,它意味着它调用的方法checkAttepmt,并且只设置会话,例如当我回显没有任何东西出现时!

当我在Home控制器中打印会话变量时,我发现ajax控制器中的会话集存在(我在每次测试中清除它们)。

我使用了这样的debug_backtrace()来解决问题

class ajax extends Controller
{

    public function __construct()
    {
        parent::__construct(false);
        $_SESSION['trace'] = debug_backtrace();
    }
}

结果是

[trace] => Array
        (
            [0] => Array
                (
                    [file] => D:\__path__\application\core\application.php
                    [line] => 24
                    [function] => __construct
                    [class] => ajax
                    [object] => __PHP_Incomplete_Class Object
                        (
                            [__PHP_Incomplete_Class_Name] => ajax
                        )

                    [type] => ->
                    [args] => Array
                        (
                        )

                )

            [1] => Array
                (
                    [file] => D:\__path__\public\index.php
                    [line] => 15
                    [function] => __construct
                    [class] => Application
                    [object] => Application Object
                        (
                            [controller:protected] => __PHP_Incomplete_Class Object
                                (
                                    [__PHP_Incomplete_Class_Name] => ajax
                                )

                            [method:protected] => getConfirmMsg
                            [params:protected] => Array
                                (
                                )

                        )

                    [type] => ->
                    [args] => Array
                        (
                        )

                )

__PHP_Incomplete_Class和这个问题之间的关系是什么以及如何解决它?

1 个答案:

答案 0 :(得分:0)

我发现了问题!在点击事件发生之前我已经解决了一些jQuery ajax请求我现在修复它。