【问题标题】:Unexpected error when programming OOP in PHP?在 PHP 中编程 OOP 时出现意外错误?
【发布时间】:2013-03-27 21:14:46
【问题描述】:

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

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

关于这段代码:

<?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 中存储一个包含这么多扩展的函数类?

【问题讨论】:

    标签: php session fatal-error


    【解决方案1】:

    那是因为你在gebruiker 的构造函数中得到了递归。您在 gebruiker 的构造函数中创建了一个新的 login_form 对象,该对象继承自 gebruiker,并且由于您还继承了 gebruiker 的__construct 方法,因此您创建了越来越多的 login_forms,最终导致内存错误

    【讨论】:

    • 啊,是的,但是我怎样才能使用受保护的,所以我仍然可以使用 login_form 的属性。还是我应该把它们都公开?
    • @sirwilliam 你应该修改这部分应用程序的架构。
    • 您误解了 oop 概念-您使用继承来创建分层类结构-在您的情况下,您在 login_form 中只有实用方法,它不使用父类中的任何内容。只需删除extends,您的课程应该可以正常工作
    • 好吧,我这样做了。请注意,这是我第一次开始使用 OOP
    【解决方案2】:

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

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

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

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

    两种修复方法:

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

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

    希望这会有所帮助!

    【讨论】:

    • 好的,我明白了,我解决了这个问题。这对我来说是新的,所以谢谢你的清晰解释。我正在审查我的代码。无论如何,将整个对象存储在 SESSION 中都是一个愚蠢的 id,所以我从头开始。我现在对 OOP 概念有了更多的了解,谢谢! PS,哇,你用 1 个声望回答了这个问题!我是第一个从你的知识中受益的人。
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 2022-06-14
    • 2013-07-06
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多