【问题标题】:Is it better to use properties only classes, if I instance them very often?如果我经常实例化它们,只使用属性类会更好吗?
【发布时间】:2019-06-14 16:31:55
【问题描述】:

我是 php OOP 的新手,并且有一个关于实例化类的一般性问题。

在 CodeIgniter 中,我创建了一个包含一些属性和一些方法的示例类。在实例化此类并设置所有属性后,我使用 var_dump() 方法查看实例化对象的外观。它会转储一个非常大的字符串,其中包含许多不必要的数据和子对象。

这是我的课:

class Searchset {

    private $id;
    private $name;
    private $created;

    public function __construct()
    {
        $this->CI =& get_instance();
        $this->CI->load->model('search_model');
        $this->CI->load->library('krumo');
    }

    public function getSearchSet()
    {
        return $this->CI->search_model->getSearchSet();
    }

    public function getAllSearchSetsByUserId($userId)
    {
        return $this->CI->search_model->getAllSearchSetsByUserId();
    }

    public function setId($value)
    {
        $this->id = $value;
    }

    public function setName($value)
    {
        $this->name = $value;
    }

    public function setCreated($value)
    {
        $this->created = $value;
    }
}

我把上面的这个类改成了下面的类:

class Test {

    private $id;
    private $name;
    private $created;

    public function setId($value)
    {
        $this->id = $value;
    }

    public function setName($value)
    {
        $this->name = $value;
    }

    public function setCreated($value)
    {
        $this->created = $value;
    }
}

当我现在创建一个实例并设置所有属性时,我会得到一个更小的 var_dump,其中只有属性(这就是我想要实现的):

object(Test)#24 (3) { ["id":"Test":private]=> string(1) "1" ["name":"Test":private]=> string(16) "测试搜索集" ["created":"Test":private]=> string(19) "2019-06-06 11:45:25" }

我经常实例化这个类(我构建这些对象的大型数组)并且不希望它们太大(性能)。 有没有办法创建一个“小”实例,只包括第一个显示的类(searchSet)的属性? 或者我应该创建 2 个类?一个用于方法,第二个仅用于属性?

我应该如何处理这个问题?

【问题讨论】:

  • 你不应该处理这个问题,因为此时这个问题还不存在。在出现性能问题的情况下,问题往往出乎意料,如果您开始优化性能,您的改进可能会适得其反,或无关紧要。
  • 由于您在构造函数中引用了整个 CodeIgniter 对象,因此预计会出现大量转储。拿到模型和库后,你真的需要保留它的引用吗?
  • 不是真的,我猜。我应该如何以及在哪里销毁引用?
  • 不要将实例分配给$this->CI,而是保留本地引用并仅分配您的模型:$ci = & get_instance(); $ci->load->model('search'); $this->model = $ci->model->search_model;。它仍然会产生大量转储,但应该更精简。解决问题的性能方面,应该不是问题,因为它是对单例的引用(它总是返回相同的对象,只有 one 该类型的对象)
  • 感谢您的快速回答,它给了我一些重要的想法。同时,我发现将模型实例的创建移动到类方法(它需要)将大转储减少到只有我需要的属性值。我的意思是,我不需要在构造函数中实例化模型,如果我只需要一个或多个方法。

标签: php codeigniter oop object instance


【解决方案1】:

这与其说是不受欢迎的结果,不如说是加载包含其所有对象的 CI 实例的结果。如果你需要访问 CI 对象,那么你必须使用它,如果你不......那么你没有。

您可以通过不在构造函数中分配 CI 实例,而是在您需要访问某些 CI 对象的函数中分配来稍微提高代码效率。

class Test {

    public function cinotneeded() {
        echo 'hello world';
    }

    public function cineeded() {
        $CI = &get_instance();
        return $CI->db->get('blog')->result();
    }

}

但老实说,我怀疑通过这种方式与构造方法相比,您会看到很多性能提升。正如您所说,并且正如您的代码所建议的那样,一些函数设置属性,而一些函数执行代码块。因此,您不会看到任何性能提升,因为它们通常会以这种方式使用(在同一实例中):$this->set('foo', 'bar')->get('blog');

其中 set 会将 foo 设置为 bar,这些属性将用于从 blog 获取结果。所以 CI 总是在某种程度上参与其中。

如果您有一个简单地返回与 CI 无关的内容的函数,您可能会看到一些(可以忽略不计)的性能提升。

例如

function controller() {
    $this->load->library('somelibrary');
    echo $this->somelibrary->get_rand();
}

// library function
function get_rand() {
    return rand();
}

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多