如果我经常实例化它们,只使用属性 类 是否更好?
Is it better to use properties only classes, if I instance them very often?
我是 php OOP 的新手,有一个关于实例化 classes 的一般性问题。
在 CodeIgniter 中,我创建了一个示例 class,其中包含一些属性和一些方法。在实例化此 class 并设置所有属性后,我使用 var_dump() 方法查看实例化对象的外观。它转储了一个非常大的字符串,其中包含许多不必要的数据和子对象。
这是我的 class:
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 改成了下面的 class:
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) "Test Searrch Set" ["created":"Test":private]=> string(19) "2019-06-06 11:45:25" }
我经常实例化这个 class(我构建这些对象的大型数组)并且不希望它们太大(性能)。
有没有办法创建一个 'small' 实例,只包含第一个显示 class (searchSet) 的属性?
或者我应该创建 2 classes?一个用于方法,第二个仅用于属性?
我该如何处理这个问题?
你可以使用魔术方法:__debugInfo()
https://www.php.net/manual/en/language.oop5.magic.php#object.debuginfo
与其说这是一个不受欢迎的结果,不如说它是加载包含其所有对象的 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');
where set 会将 foo
设置为 bar
,这些属性将用于从 blog
获取结果。所以 CI 总是在某种程度上参与这里。
如果您的函数只返回与 CI 无关的内容,您可能会看到 一些 (可忽略不计)的性能提升。
例如
function controller() {
$this->load->library('somelibrary');
echo $this->somelibrary->get_rand();
}
// library function
function get_rand() {
return rand();
}
我是 php OOP 的新手,有一个关于实例化 classes 的一般性问题。
在 CodeIgniter 中,我创建了一个示例 class,其中包含一些属性和一些方法。在实例化此 class 并设置所有属性后,我使用 var_dump() 方法查看实例化对象的外观。它转储了一个非常大的字符串,其中包含许多不必要的数据和子对象。
这是我的 class:
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 改成了下面的 class:
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) "Test Searrch Set" ["created":"Test":private]=> string(19) "2019-06-06 11:45:25" }
我经常实例化这个 class(我构建这些对象的大型数组)并且不希望它们太大(性能)。 有没有办法创建一个 'small' 实例,只包含第一个显示 class (searchSet) 的属性? 或者我应该创建 2 classes?一个用于方法,第二个仅用于属性?
我该如何处理这个问题?
你可以使用魔术方法:__debugInfo()
https://www.php.net/manual/en/language.oop5.magic.php#object.debuginfo
与其说这是一个不受欢迎的结果,不如说它是加载包含其所有对象的 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');
where set 会将 foo
设置为 bar
,这些属性将用于从 blog
获取结果。所以 CI 总是在某种程度上参与这里。
如果您的函数只返回与 CI 无关的内容,您可能会看到 一些 (可忽略不计)的性能提升。
例如
function controller() {
$this->load->library('somelibrary');
echo $this->somelibrary->get_rand();
}
// library function
function get_rand() {
return rand();
}