Лучше ли использовать свойства только классов, если я их создаю очень часто? - PullRequest
0 голосов
/ 14 июня 2019

Я довольно новичок в 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) "Test Searrch Set" ["созданный": "Test": private] => string (19) "2019-06-06 11:45:25"}

Я создаю этот класс очень часто (я создаю большие массивы этих объектов) и не хочу, чтобы они были слишком большими (производительность). Есть ли способ создать «маленький» экземпляр, включающий только свойства с первым показанным классом (searchSet)? Или я должен создать 2 класса? Один для методов, а второй только для свойств?

Как мне справиться с этой проблемой?

Ответы [ 2 ]

0 голосов
/ 15 июня 2019

Это не столько нежелательный результат, сколько результат загрузки экземпляра 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.

, например

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

// library function
function get_rand() {
    return rand();
}
0 голосов
/ 14 июня 2019

Вы можете использовать магический метод: __debugInfo ()

https://www.php.net/manual/en/language.oop5.magic.php#object.debuginfo

...