Когда я использую статические переменные/функции в php?

Если Вам нравится использовать различные типы определенной длины и со знаком, Вы, вероятно, более обеспечены с uint8_t, int8_t, uint16_t, и т.д. просто, потому что они делают точно, что они говорят.

72
задан zombat 10 August 2009 в 22:31
поделиться

3 ответа

Вы используете static , когда хотите использовать метод / переменную, не привязанную к экземпляру. Это может произойти, когда:

  • Нет никакой связи с вашей целью и экземпляром (полезно для наборов инструментов на языках, которые не допускают ничего, кроме ООП, например Java, но бесполезны в PHP).

  • Вы хотите контролировать доступ к экземпляру. Чаще всего экземпляр, с которым вы хотите иметь дело, не определяется при написании кода, но будет выполняться. Шаблон Singleton является лучшим примером. Вы можете использовать статические методы в качестве фабрик для создания объекта в соответствии с контекстом или совместного использования ресурсов с другими экземплярами. EG: статический член может предоставлять доступ к уровню базы данных, поэтому часть приложения получает доступ к тому же самому слою из любого места, и оно открывается / закрывается без конфликтов.

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

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

Прекрасным примером является анализатор строк:

class MyObject 
{
 static function parse($str)
 {
    $obj = new MyObject();
    // some parsing/setting happens here
    return $obj;
 }
}

// you create an object "MyObject" from a string, so it's more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");
55
ответ дан 24 November 2019 в 12:44
поделиться

Статические функции и переменные используются для доступа к переменным / функциям в глобальной области, например:

echo myClass::myVariable;
echo myClass::myFunction();

Когда что-то статично, к нему можно получить доступ где угодно, и это очень похоже на процедурное type, за исключением того, что она может использовать self и содержится в области классов.

class myClass{
    static $myVariable = "myVar";
    static function myFunction()
    {
       return "myFunc";
    }
}

Один из способов ее использования - сохранить только один экземпляр класса или Singleton Method.

class myClass
   {
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        else
        {
            return self::$class;
        }
    }
    private function __construct()
    {
         // my constructor
    }
    // Then create regular class functions.
   }

Поскольку у него есть частный конструктор , его нельзя создать с помощью оператора new , поэтому вы вынуждены вызывать myClass :: get_connection () , чтобы получить класс. Эта функция может создать новый класс (потому что он является членом класса). Затем он сохраняет класс в статической переменной, и если вы снова вызовете функцию, она просто вернет созданный класс.

В конце концов, ключевое слово static используется для хранения вещей, ну, static, в отношении области видимости. Это означает, что вы не хотите, чтобы что-либо «менялось» из-за текущего объема. Хотя метод Singleton немного расширяет его, он придерживается той же идеи, что у вас всегда есть «один и тот же» класс, независимо от того, в какой области вы находитесь.

Документация PHP
Статическое ключевое слово
Оператор разрешения области

StackOverflow Knowledge
Как избежать использования глобальных объектов PHP
Совместное использование переменных между функциями в PHP без использования глобалов
Обеспечение доступности глобальной переменной для каждой функции внутри класса
Глобальный или синглтон для подключения к базе данных
Классы PHP: когда использовать :: vs. ->?

22
ответ дан 24 November 2019 в 12:44
поделиться

Вот случайное, хотя довольно хорошее описание различий между статическими методами и методами экземпляра .

Из сообщения:

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

Когда вы объявляете метод как статический, вы определяете этот метод как метод класса. Метод класса применяется к классу, а не к любому конкретный экземпляр. Поведение, вызванное методом класса, делает не полагаться на состояние конкретного экземпляра. Фактически, статический метод не может полагаться на состояние экземпляра, поскольку статические методы не имеют доступ к этой ссылке. Вместо этого поведение метода класса либо зависит от состояния, которое все объекты разделяют на уровне класса, или не зависит от какого-либо состояния вообще.

Если метод полагается на состояние экземпляра объекта, он должен быть методы экземпляра. Если метод является общим для всех экземпляров класс и не зависит от состояния объекта, он должен быть статическим метод. Чаще всего используются методы экземпляра. Однако статический методы очень полезны для служебных и фабричных классов среди многих другое использование.

7
ответ дан 24 November 2019 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: