Метод класса вызова php из статического метода внутри одного класса, но не созданный экземпляр

php 5.3 +

Извините за длинный вопрос, но я хочу полностью изучить это.

Я знаю, что не могу вызвать нестатический метод одного класса из статического метода, не создавая экземпляр класса как объекта.

class Person 
{
    private $people_array;

    function data_all_get()
    { // touch database, return array of people
      $this->people_array = // etc dbquery results
    }

    static function showPeople()
    {  // call class method
       $people_data = $this->data_all_get();
       // Fatal error: Using $this when not in object context
    }
} // end class Person

От поиска по SO я нашел несколько интересных подходов, но задаюсь вопросом, как каждый подход влияет на среду кода.

Мои вопросы ниже:

Я мог бы создать экземпляр класса как объекта внутри статического метода, чтобы получить доступ к нестационарному методу

static function showPeople()
{  // instantiate as object
   $person = New Person();
   // call class method
   $people_data = $this->data_all_get();
}

Q1 - какие проблемы могут возникнуть? в моей ситуации класс не имеет конструктора, поэтому никакие другие методы класса и вары не будут затронуты экземпляром. Будет ли этот новый объект занимать немного места в памяти во время выполнения script? Не кажется слишком плохим...


другой вариант заключается в преобразовании метода data_all_get в статический метод, поэтому его можно было бы вызвать из статического метода showPeople, т.е.

self::showPeople()

метод "data_all_get" используется другими методами в классе, когда он создается как объект, чтобы установить значение private var, чтобы уменьшить поездки в базу данных, если он уже установлен. Я знаю, что это, вероятно, может быть частью функции-конструктора, но мне никогда не нужно, чтобы этот объект "Person" устанавливался более одного раза за запрос php script, класс в основном используется для группировки функций и варов вместе для организации...

Q2 - каковы последствия создания "data_all_get" в статическом методе? есть ли? если метод был статичным, но он устанавливает значение private var $people_array (которое не является статическим), я думаю, что var может быть обновлен или перезаписан, если объект когда-либо понадобился для создания второго раза в одном script запрос, правильно? Плюс, поскольку свойство не статично, другие методы класса могут получить к нему доступ.

Q3. Могу ли я вызвать статический метод "data_all_get" столько раз, сколько захотел, не "сломав что-либо" (загруженный вопрос IK).

Q4. Он просто использует дополнительную память каждый раз при вызове статического метода?

Спасибо

Ответ 1

class Person 
{
    private static $people_array;

    static public function data_all_get()
    { 
         self::$people_array = //DBStuff
    }

    static public function showPeople()
    {  
        $people_data = self::data_all_get();
    }
 }

Всего несколько заметок, некоторые, возможно, очевидны. 1) Как и вы, вы не возвращаете ничего такого явно, что приведенный выше код не сработает. Нет ничего плохого, например, с приведенным выше кодом. В ответ на ваш Q1 все, что вы сделали, взяли пару вызовов функций с использованием глобальной переменной и инкапсулировали их внутри класса. Я бы посоветовал иногда использовать это как экземпляр класса, а иногда и не делать этого, так как это сделает ваш окончательный код менее понятным и более трудным для понимания людьми, когда они его просмотрят.

Если вы беспокоитесь о том, чтобы создать экземпляр этого более одного раза, вам может понадобиться посмотреть шаблон дизайна singleton, но в целом, если вы планируете создавать экземпляр класса в какой-то момент, я бы переосмыслил, почему вы назвав их статически в первую очередь. Нет ничего плохого в этом, скажем, кроме того, что это "неправильно" для меня.

Q2) Единственная возможность сделать data_all_get в статическом массиве - это то, что ссылается на статическое свойство, которое, в свою очередь, означает, что это свойство будет недоступным, если оно создается. Кроме того, вы теряете возможность создавать несколько версий этого класса (если это имеет значение) и в основном превращать people_array в глобальную переменную. Это не обязательно плохо, но не зная, что остальная часть вашей функциональности делает это трудно сказать, каковы последствия.

Q3) Единственная проблема, выполняющая его несколько раз: A) уничтожение всех, что находится в массиве людей, и B) множественные вызовы БД. Не видя, что происходит с другим кодом, этот вопрос более или менее невозможно ответить.

Q4). Память для метода, размер которого вы указали здесь, ничтожно мал, о чем не стоит говорить. Озабоченность связана с самим вызовом DB и количеством доступных там строк.

Наконец, это немного странно, поскольку у вас есть этот код, написанный сейчас, поскольку showPeople выполняет то же самое, что и data_all_get. Вероятно, вы захотите написать некоторую логику внутри showPeople, чтобы узнать, пуст или нет файл $people_array, и если да, запустите data_all_get, а если нет, верните people_array. Это позволит избежать дополнительных чтений БД. Если вы собираетесь читать DB каждый раз в любом случае, тогда вы можете также иметь data_all_get return $people_array, и в этом случае ни одно из этого не должно быть внутри класса, и это может быть просто вызов функции, который возвращает то, что он находит в db.