在PHP中编程OOP时出现意外错误


Unexpected error when programming OOP in PHP?

由于某些原因,我得到了这个错误:

致命错误:允许的内存大小为134217728字节耗尽(已尝试)分配36字节)在C:'xampp'htdocs'school'blom'inlogDinkie 'engine'class.php on line 13

在这段代码中:

<?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中。我没有声明很多代码,所以我不明白为什么我达到了内存限制。

还是因为我不能在$_SESSION中存储具有如此多扩展的函数类?

这是因为您在gebruiker的构造函数中得到递归。您在gebruiker的构造函数中创建了一个新的login_form对象,它继承自gebruiker并且由于您也继承了gebruiker的__construct方法,因此您创建了越来越多的login_forms最后出现了内存错误

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

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

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

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

修复方法:

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

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

希望这对你有帮助!