【问题标题】:PHP Class Inheritance - Out of MemoryPHP 类继承 - 内存不足
【发布时间】:2013-12-03 18:24:19
【问题描述】:

我到处都看到你不能扩展多个类......即

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 的内存,我什至还尝试了将内存设置为 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="dev@mydomain.com";
        $headers="From: \"Error Checking\" <dev@mydomain.com>";
        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.");
}

请记住,这不是全部代码,还有一个 Autoloader 和几个不同的文件,但这是一个基本版本,我刚刚检查过,我仍然从中得到内存不足的错误。

【问题讨论】:

  • 当然,您可以扩展一个可扩展的类。您遇到的问题是您的 //DO STUFF HERE 实现中的问题。例如,如果您要在其自己的构造函数中实例化一个对象的实例,从而导致无限的实例化链......
  • 是的,它是有效的。你基本上只是在分支家谱。这样的继承不是简单的 sizeof(Foobar) + sizeof(Foo)。继承的全部意义在于代码被重用。从技术上/模糊地说,sizeof(Foobar) 将是 sizeof(Foo) + sizeof(any changes made in Foobar that aren't in Foo)
  • 让我发布一些代码......一秒钟
  • 构造函数也被继承......当你初始化Loader实例时,CORE构造函数被调用......它试图初始化新的Loader。基本上:你有无限循环。另外,我真的希望这不是一些“mvc 框架”。在过去的一个小时内,我们已经发布了 4 个这样的帖子。
  • @JustinE 你不应该在这里使用继承。而是考虑组合,也许通过依赖注入。

标签: php class oop


【解决方案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="dev@mydomain.com";
        $headers="From: \"Error Checking\" <dev@mydomain.com>";
        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.");
}

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2018-07-21
    • 2015-08-13
    相关资源
    最近更新 更多