0

何らかの理由で、次のエラーが発生します。

致命的なエラー: C:\xampp\htdocs\school\blom\inlog dinkie\engine\class.php の 13 行目で、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()クラスを .xml 内に保存しているため、このエラーが発生したと思います$_SESSION。多くのコードを宣言していないため、メモリ制限に達する理由がわかりません。

それとも、内部に非常に多くの拡張機能を持つ機能クラスを格納できないため$_SESSIONですか?

4

2 に答える 2

3

のコンストラクターで再帰を取得するためですgebruiker。gebruiker のコンストラクターで、gebruiker から継承する新しい login_form オブジェクトを作成し、gebruiker の__constructメソッドも継承するため、ますます多くの login_forms を作成し、最終的にメモリ エラーが発生します。

于 2013-03-27T21:21:20.363 に答える
1

あなたのようなメモリ割り当ての失敗は、通常、無限再帰が原因です.13行目の場合(エラーで指定されています)。この問題は、コンストラクターの継承によるものです。

クラスを拡張するとき、そのコンストラクターが public の場合は、拡張されたクラスのコンストラクターも継承します (ただし、拡張クラスで新しいコンストラクターを定義すると、それがオーバーライドされます)。あなたの場合、フローは次のようになります。

  • 開始オブジェクトを作成します
  • あなたの開始オブジェクトはgebruikerを作成します
  • あなたの gebruiker オブジェクトは login_form オブジェクト (これは gebruiker を拡張し、そうする理由はありません) を作成し、明示的なコンストラクターを持たないため、作成時に gebruiker::__construct() を実行します
  • このオブジェクトは、独自の login_form を作成します。

ここで無限ループが発生します。

それを修正する2つの方法:

継承を削除 します。login_form は静的な HTML を出力するだけで、実際には gebruiker の関数を 1 つも必要としないため、継承を削除しても何も失われません。

明示的なコンストラクター定義を login_form に追加します。これにより、親コンストラクターが実行されなくなります。

お役に立てれば!

于 2013-03-27T21:27:28.643 に答える