Когда я использую статические переменные / функции в php?
Я обновляю себя на ООП с помощью PHP, и я видел пример установки функций и / или переменных как статических. Когда и почему я должен установить переменную / функцию в static? Я работал с другими языками и никогда не вспоминал, когда использовал static, я никогда не находил для него реальной цели. Я знаю, что он делает, но почему бы не использовать вместо него переменную?
8 ответов
Вы используете static, когда хотите использовать метод / переменную, которая не привязана к экземпляру. Это может произойти, когда:
Нет никакого отношения к вашей цели и экземпляру (полезно для наборов инструментов в языках, которые не допускают ничего, кроме ООП, такого как Java, но не полезны в PHP).
Вы хотите контролировать доступ к экземпляру. Чаще всего экземпляр, с которым вы хотите иметь дело, не определяется при написании кода, но будет при исполнении. Шаблон Singleton - лучший пример. Вы можете использовать статические методы как фабрики для создания объекта в соответствии с контекстом или совместного использования ресурсов с другими экземплярами. Например: статический член может предоставлять доступ к слою базы данных, поэтому часть приложения получает доступ к нему из любого места и открывается / закрывается без конфликтов.
Спектакли имеют значение, и метод будет выполняться много раз. В этом случае вы сэкономите некоторое время процессора, не позволяя интерпретатору искать члена в экземпляре при каждом вызове. Но, тем не менее, если perfs становится такой проблемой, что вы приходите к этому решению, возможно, пришло время пересмотреть вашу архитектуру или использовать привязку к более быстрому языку для критических частей кода.
У вас есть метод, который связан с типом, но будет применяться к другому. Может иметь смысл записать метод в объявление первого типа, но установить его статическим, поскольку он ожидает экземпляр другого типа.
Прекрасный пример - анализатор строк:
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()
чтобы получить класс. Эта функция может создать новый класс (потому что он является членом класса). Затем он сохраняет класс в статической переменной, и если вы снова вызовете функцию, он просто вернет созданный класс.
В конце ключевое слово static используется, чтобы держать вещи, ну, в общем, статичные, в отношении области. Это означает, что вам не нужно ничего "менять" из-за текущей области видимости. Хотя метод Singleton немного растягивает это, он придерживается той же идеи, что у вас всегда есть "один и тот же" класс, независимо от того, в какой области вы находитесь.
PHP документация
Статическое ключевое слово
Оператор разрешения области
Stac kru Knowledge
Как избежать использования глобальных объектов PHP
Совместное использование переменных между функциями в PHP без использования глобальных переменных
Создание глобальной переменной, доступной для каждой функции внутри класса
Global или 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
Поэтому, пока страница обрабатывается, я могу позвонить, может быть, 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 формируют наши основные строительные блоки.
Если вы хотите поделиться данными со всеми экземплярами, например, счетчик количества экземпляров, созданных при текущем выполнении.