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

Я обновляюсь на OOP с помощью PHP, и я видел пример установки функций и/или переменных как статических. Когда и зачем мне ставить переменную/функцию? Я делал другие языки и на самом деле не помню, чтобы когда-либо использовал статику, я никогда не нашел для нее реальной цели. Я знаю, что он делает, но почему бы просто не использовать переменную?

Ответ 1

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

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

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

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

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

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

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 more obvious
// to read it this way :
$new_obj = MyObject::parse("This a description of a super cool object");

Ответ 2

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

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

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

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

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

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 используется для хранения вещей, ну, статических, в отношении области. Это означает, что вы не хотите, чтобы что-то "менялось" из-за текущей области. Хотя метод Singleton немного растягивается, он придерживается той же идеи, что у вас всегда есть "тот же" класс, неважно, в какой области вы находитесь.

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

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

Ответ 3

Также очень полезно кэшировать, если метод будет вызываться очень часто и делать то же самое, например:

/**
 * Returns true if the user is logged in through shibboleth
 *
 * @return boolean true on success, else false
 */
protected function is_logged_in() {

    //Check shibboleth headers
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
        if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
            return true;
        }
    }
    return false;
}

Этот метод будет вызван в моей структуре очень часто, и там он будет делать для каждого вызова поиск базы данных для моей конфигурации ключ $_SERVER

Таким образом, пока страница обрабатывается, я звоню, возможно, 10 раз в одной загрузке страницы, она будет иметь 10 запросов к базе данных, но я изменил ее на:

/**
 * Returns true if the user is logged in through shibboleth
 *
 * @return boolean true on success, else false
 */
protected function is_logged_in() {
    static $logged_in = null;
    if($logged_in != null) {
        return $logged_in;
    }

    //Check shibboleth headers
    if (!empty($_SERVER['HTTP_SHIB_IDENTITY_PROVIDER']) || !empty($_SERVER['Shib-Identity-Provider'])) {
        if (!empty($_SERVER[$this->core->dbconfig("shib_auth", self::SHIB_AUTH_CONFIG_UID)])) {
            $logged_in = true;
            return true;
        }
    }
    $logged_in = false;
    return false;
}

Так что просто проверяйте каждую загрузку страницы один раз на обычное поведение, если я вошел в систему и кешировал результат. в следующий раз он просто вернет кешированное значение. Эта функция часто используется для повышения производительности.

Надеюсь, что это поможет.

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

Посетите: http://verraes.net/2014/06/when-to-use-static-methods-in-php/

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

Ответ 7

Если вы хотите обмениваться данными со всеми экземплярами, такими как счетчик для количества экземпляров, созданных при текущем выполнении.

Ответ 8

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

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

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

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