由于某些原因,我得到了这个错误:
致命错误:允许的内存大小为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 = ' ';
protected $error_pass = ' ';
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:这将阻止父构造函数运行。
希望这对你有帮助!