0

出于某种原因,我收到此错误:

致命错误:第 13 行 C:\xampp\htdocs\school\blom\inlog dinkie\engine\class.php 中允许的内存大小为 134217728 字节已用尽(试图分配 36 字节)

在这段代码上:

<?php

class gebruiker extends start{

    private $_login_form;
    public $log_in;
    public $logged_in;

    function __construct(){

        $this->logged_in = false;

        $this->_login_form = new login_form();

        parent::html($this->_login_form);

    }

    function log_in(){

        $html = $this->_login_form;

        if($this->log_in){

            $go = true;
            if(!$_REQUEST['naam']){
                $this->_login_form->error_naam = 'vul je naam in!';
                $go = false;
            }
            else{
                $this->_login_form->naam = $_REQUEST['naam'];
            }

            if(!$_REQUEST['pass']){
                $this->_login_form->error_pass = 'vul je pass in!';
                $go = false;
            }
            else{
                $this->_login_form->pass = $_REQUEST['pass'];
            }
            //go log in

            $html = $dom->saveHTML();
        }

        parent::html($this->_login_form->form());
    }

}

class login_form extends gebruiker{

    protected $html;
    protected $error_naam = '&nbsp;&nbsp;&nbsp;';
    protected $error_pass = '&nbsp;&nbsp;&nbsp;';
    protected $naam = ''; 
    protected $pass = '';

    function form(){
        $this->html = ' <center>
                            <div style="border:1px dotted rgb(169, 169, 169); width:572px; height:196px; background-color:rgba(40, 152, 250, 0.670588);margin-top:200px;">
                                <h4 id="title">Inloggen</h4>
                                <br>
                                <form action="./?login" method="post">
                                <table>
                                    <tr>
                                        <td id="error_naam">'.$error_naam.'</td>
                                        <td id="error_pass">'.$error_pass.'</td>
                                    </tr>
                                    <tr>
                                        <td><input id="naam" type="text" placeholder="naam" name="naam" value="'.$naam.'" /></td>
                                        <td><input id="pass" type="password" placeholder="wachtwoord" name="pass" value="'.$pass.'" /></td>
                                    </tr>
                                    <tr>
                                        <td><input type="submit" value="Inloggen" /></td>
                                        <td></td>
                                    </tr>
                                </table>
                            </div>  
                        </center>';
        return $this->html;
    }
}

?>

这是这个的后端:

<?php

include_once('engine/database.php');
include_once('engine/class.php');

$start = new start();

class start{

    private $_html;

    function __construct(){

        session_start();
        if(isset($_SESSION['gebruiker'])){

            if(isset($_REQUEST['login'])){
                $_SESSION['gebruiker']->log_in = true;
                $_SESSION['gebruiker']->log_in();
            }
            elseif(isset($_REQUEST['register'])){
                //register
            }
            elseif(!$_SESSION['gebruiker']->logged_in){
                $_SESSION['gebruiker']->log_in = false;
                $_SESSION['gebruiker']->log_in();
            }
            else{
                switch($_REQUEST['actie']){
                    case 'iets':
                        //dostuf
                        break;
                    default:

                        echo 'deafauasdfasdr';

                        break;
                }                   
            }
        }
        else{
            $_SESSION['gebruiker'] = new gebruiker();
            //$new = new gebruiker();
        }
    }

    protected function html($html = 'emty'){
        $this->_html = $html;
    }

    function __destruct(){
        echo $this->_html;
    }

}

?>

现在我认为我收到此错误是因为我将gebruiker()类存储在$_SESSION. 我没有声明很多代码,所以我不明白为什么会达到内存限制。

或者是因为我不能在 a 中存储一个有这么多扩展的函数类$_SESSION

4

2 回答 2

3

那是因为你在gebruiker. 您在 gebruiker 的构造函数中创建了一个新的 login_form 对象,该对象继承自 gebruiker 并且因为您也继承了__constructgebruiker 的方法,所以您创建了越来越多的 login_forms 并最终导致内存错误

于 2013-03-27T21:21:20.363 回答
1

像您这样的内存分配失败通常是由于无限递归,在您的情况下,在第 13 行(由错误指定)。问题是由于构造函数继承。

当你扩展一个类时,如果所述构造函数是公共的,你也会继承扩展类的构造函数(尽管在你的扩展类中定义一个新的构造函数会覆盖它)。在您的情况下,流程如下:

  • 您创建一个起始对象
  • 您的起始对象创建了一个 gebruiker
  • 您的 gebruiker 对象创建一个 login_form 对象(扩展 gebruiker 并且没有理由这样做),没有显式构造函数,因此在创建时运行 gebruiker::__construct()
  • 此对象创建自己的 login_form。

这就是发生无限循环的地方。

修复它的两种方法:

删除继承: 这样做不会有任何损失,因为您的 login_form 只输出静态 HTML,实际上不需要 gebruiker 的单个函数。

向 login_form 添加显式构造函数定义:这将阻止父构造函数运行。

希望这可以帮助!

于 2013-03-27T21:27:28.643 回答