2013-03-27 43 views
0

出於某種原因,我得到這個錯誤:在PHP中編程OOP時出現意外的錯誤?

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 36 bytes) in C:\xampp\htdocs\school\blom\inlog dinkie\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內存儲這麼多擴展的功能類?

回答

1

內存分配失敗,如你創建通常是由於無限遞歸,在你的情況在13行(由錯誤指定)。這個問題是由於構造函數的繼承。

當您擴展一個類時,如果所述構造函數是公共的(儘管在您的擴展類中定義一個新構造函數覆蓋它),您還繼承擴展類的構造函數。在你的情況下,流轉如下:

  • 您創建一個起始對象
  • 你的起始對象創建gebruiker
  • 你gebruiker對象創建login_form對象(延伸gebruiker並沒有理由這樣做),沒有顯式構造函數,因此在創建時運行gebruiker :: __ construct()
  • 此對象創建自己的login_form。

這是發生無限循環的地方。

兩種方式來解決這個問題:

刪除繼承: 你這樣做,因爲你login_form失去什麼只是輸出靜態HTML和實​​際上並不需要gebruiker的單一功能。

爲login_form添加一個顯式構造函數定義:這將阻止父構造函數運行。

希望這會有所幫助!

+0

好吧,我明白了,我解決了這個問題。這對我來說是新的,所以謝謝你的明確解釋。我有任何方式審查我的代碼。在SESSION中存儲整個對象是一個愚蠢的ID,所以我從頭開始重新開始。我現在更瞭解OOP的概念謝謝! PS,哇,你用1聲望回答了這個問題!我是第一個從你的知識中獲益的人。 – botenvouwer 2013-03-27 21:37:12

3

那是因爲您在gebruiker的構造函數中獲得了遞歸。您在gebruiker新login_form對象的構造函數,它從gebruiker繼承因爲你繼承gebruiker的__construct方法,以及,你創造更多的login_forms最後一個內存錯誤

+0

啊是的,但我如何使用保護,所以我仍然可以使用login_form的屬性。還是我應該讓它們全部公開? – botenvouwer 2013-03-27 21:25:08

+0

@sirwilliam您應該修改這部分應用程序的體系結構。 – 2013-03-27 21:29:35

+0

您誤解了oop概念 - 您使用繼承來創建分層類結構 - 在您的情況下,您只有login_form內的實用程序方法,它不使用父類中的任何內容。只要刪除'擴展'和你的班級應該工作正常 – Philipp 2013-03-27 21:31:20

相關問題