【发布时间】: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