2013-12-03 48 views
3

我到處都可以看到你不能擴展多個類......也就是說,PHP類的繼承 - 內存不足

Class Foo{ 
    //DO FOO STUFF HERE 
} 

Class Bar{ 
    //DO BAR STUFF HERE 
} 

Class FooBar extends Foo,Bar{ 
    //DO FOOBAR STUFF HERE 
} 

這是有道理的,但怎麼樣:

Class Foo{ 
    //DO FOO STUFF HERE 
} 

Class Bar extends Foo{ 
    //DO BAR STUFF HERE 
} 

Class FooBar extends Foo{ 
    //DO FOOBAR STUFF HERE 
} 

例如,你可以有多個子類擴展同一個父?當我嘗試這樣做時,出現內存不足錯誤,我嘗試將內存限制增加到512MB,但仍然出現內存不足錯誤...

什麼是檢查內存使用情況的方法,我的意思是非常基本的類,即一個公共變量,Bar類爲Foo類中的變量設置值......這是一個常量,但如果我等待15-20分鐘並再試一次,那就沒問題。我的問題是,這臺服務器有32GB的RAM,我甚至已經嘗試了1024M的愚蠢設置內存。

[編輯代碼:]

Class CORE{ 
    public $load; 
    public $data; 
    public $models; 
    public function __construct(){ 
     $this->load=New Loader; 
     $this->data=New Database; 
     $this->data->db=New PDO(DSN); 
    } 
    public function __dev_email($subject, $message){ 
     $to="[email protected]"; 
     $headers="From: \"Error Checking\" <[email protected]>"; 
     mail($to, $subject, $message, $headers); 
    } 
} 
class Loader extends CORE{ 
    public function model($name){ 
     if (file_exists("/var/www/models/".$name.".php")){ 
      require_once("/var/www/models/".$name.".php"); 
      $models[$name]=New $name; 
     } 
    } 
} 
class Error extends CORE{ 
    $this->__dev_email("Bad Database Connection", "Invalid Connection Attempt was made. Please check the configuration."); 
} 

請記住,這是不是所有的代碼,有一個自動加載磁帶機,以及幾個不同的文件,但是這是一個基本的版本,我剛纔檢查,我我仍然從這個錯誤中解脫出來。

+1

當然,你可以擴展一個擴展的類。您遇到的問題是您的「在這裏做什麼」實現中的某些問題。例如,如果您要在其自己的構造函數中實例化一個對象實例,導致實例化的無限鏈...... –

+0

是的,它是有效的。你基本上只是分支家族樹。這種繼承不是簡單的sizeof(Foobar)+ sizeof(Foo)。整個繼承點是代碼被重用。技術上/模糊地說,sizeof(Foobar)將是'sizeof(Foo)+ sizeof(在Foobar中做的任何不在Foo中的變化)' –

+0

在第二個例子中,你的意思是'FooBar extends Bar'? – Rogue

回答

1

問題是當你初始化CORE時,它會創建一個擴展CORE的Loader的新實例。這會導致再次調用CORE構造函數,這又會產生另一個Loader,這意味着它會一直持續導致內存不足錯誤。

可能工作的一種方法是在初始化時將CORE傳遞給Loader類,如下所示。

Class CORE{ 
    public $load; 
    public $data; 
    public $models; 
    public function __construct(){ 
     $this->load=New Loader($this); 
     $this->data=New Database; 
     $this->data->db=New PDO(DSN); 
    } 
    public function __dev_email($subject, $message){ 
     $to="[email protected]"; 
     $headers="From: \"Error Checking\" <[email protected]>"; 
     mail($to, $subject, $message, $headers); 
    } 
} 
class Loader{ 
    private $core; 

    public function __construct($core){ 
     $this->core = $core; 
    } 

    public function model($name){ 
     if (file_exists("/var/www/models/".$name.".php")){ 
      require_once("/var/www/models/".$name.".php"); 
      $this->core->models[$name]=New $name; 
     } 
    } 
} 
class Error extends CORE{ 
    $this->__dev_email("Bad Database Connection", "Invalid Connection Attempt was made. Please check the configuration."); 
}