Я обновляюсь на OOP с PHP, и я видел пример установки функций и / или переменных как статических. Когда и зачем мне ставить переменную / функцию? Я делал другие языки и на самом деле не помню, чтобы когда-либо использовал статику, я никогда не нашел для нее реальной цели. Я знаю, что он делает, но почему бы просто не использовать переменную?
Вы используете static, если хотите использовать метод / переменную, которая не привязана к экземпляру. Это может произойти, когда:
Нет никакого отношения к вашей цели и экземпляру (полезно для наборов инструментов на языках, которые не позволяют чему-либо еще, что ООП, как Java, но не полезно в PHP).
Вы хотите контролировать доступ к экземпляру. Чаще всего экземпляр, с которым вы хотите иметь дело, не определяется при написании кода, но будет выполняться. Образец Синглтона – лучший пример. Вы можете использовать статические методы как фабрики для создания объекта в соответствии с контекстом или совместного использования ресурсов с другими экземплярами. 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");
Статические функции и переменная используются для доступа к переменным / функциям в глобальной области, например:
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()
чтобы получить класс. Эта функция может создавать новый класс (потому что он является членом класса). Затем он сохраняет класс в статической переменной, и если вы снова вызовете функцию, она просто вернет созданный класс.
В конце статическое ключевое слово используется для хранения вещей, ну, статических, в отношении области видимости. Это означает, что вы не хотите, чтобы что-то «менялось» из-за текущей области. Хотя метод Singleton немного растягивается, он придерживается той же идеи, что у вас всегда есть «тот же» класс, неважно, в какой области вы находитесь.
Документация PHP
Статическое ключевое слово
Оператор разрешения масштаба
Знания StackOverflow
Как избежать использования глобальных объектов PHP
Совместное использование переменных в PHP без использования глобалов
Создание глобальной переменной, доступной для каждой функции внутри класса
Глобальный или Singleton для подключения к базе данных
Классы PHP: когда использовать :: vs. ->?
Также очень полезно кэшировать, если метод будет вызываться очень часто и делать то же самое, например:
/** * 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 key
Поэтому, пока страница обрабатывается, я звоню, возможно, 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; }
Так что просто проверяйте каждую загрузку страницы один раз на нормальное поведение, если я вошел в систему и кэшировал результат. в следующий раз он просто вернет кешированное значение. Эта функция часто используется для повышения производительности.
Надеюсь это поможет.
Вот случайное, хотя и довольно хорошее описание различий между статическими и экземплярами .
Из сообщения:
Методы экземпляра – это методы экземпляра, поскольку они полагаются на состояние конкретного экземпляра объекта. Методы экземпляров привязаны к конкретному экземпляру, потому что поведение, которое вызывает метод, зависит от состояния этого конкретного экземпляра.
Когда вы объявляете метод статическим, вы определяете этот метод как метод класса. Метод класса применяется к классу в отличие от любого конкретного экземпляра. Поведение, вызванное методом класса, не зависит от состояния конкретного экземпляра. Фактически, статический метод не может полагаться на состояние экземпляра, поскольку статические методы не имеют доступа к этой ссылке. Вместо этого поведение метода класса зависит от состояния, которое все объекты разделяют на уровне класса или вообще не зависит от какого-либо состояния.
Если метод опирается на состояние экземпляра объекта, он должен быть методом экземпляра. Если метод является общим для всех или ни одного экземпляра класса и не зависит от состояния объекта, он должен быть статическим методом. Наиболее часто используются методы экземпляров. Однако статические методы очень полезны для классов утилит и фабрик во многих других целях.
Как правило, используя статическую функцию, вы можете оптимизировать скорость, а также память, а область применения метода не должна изменяться. Она должна быть статической по своей природе, и вы можете получить доступ к статическим свойствам объектов, методы, не инициируя их, чтобы экономить память в среднем.
Посетите: http://verraes.net/2014/06/when-to-use-static-methods-in-php/
Статические методы – это не что иное, как глобальные функции с именами. Помещение имен, я думаю, мы все можем согласиться, это здорово. Что касается глобальных функций: мы используем их все время. Нативные функции в PHP формируют наши основные строительные блоки.
Если вы хотите обмениваться данными со всеми экземплярами, такими как счетчик для количества экземпляров, созданных при текущем выполнении.
Статические элементы имеют ряд характеристик, которые могут быть полезны.
Во-первых, они доступны из любого места в вашем скрипте (при условии, что у вас есть доступ к классу). Это означает, что вы можете получить доступ к функциям без необходимости передавать экземпляр класса из объекта в объект или, что еще хуже, хранить экземпляр в глобальной переменной.
Во-вторых, статическое свойство доступно для каждого экземпляра класса, поэтому вы можете установить значения, которые должны быть доступны всем членам типа.
Наконец, тот факт, что вам не нужен экземпляр для доступа к статическому свойству или методу, может спасти вас от создания экземпляра объекта, чтобы получить простоту.