Я обновляюсь на OOP с помощью PHP, и я видел пример установки функций и/или переменных как статических. Когда и зачем мне ставить переменную/функцию? Я делал другие языки и на самом деле не помню, чтобы когда-либо использовал статику, я никогда не нашел для нее реальной цели. Я знаю, что он делает, но почему бы просто не использовать переменную?
Когда я использую статические переменные/функции в 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 (при условии, что у вас есть доступ к классу). Это означает, что вы можете получить доступ к функциям без необходимости передавать экземпляр класса из объекта в объект или, что еще хуже, хранить экземпляр в глобальной переменной.
-
Во-вторых, статическое свойство доступно для каждого экземпляра класса, поэтому вы можете установить значения, которые должны быть доступны всем членам типа.
-
Наконец, тот факт, что вам не нужен экземпляр для доступа к статическому свойству или методу, может спасти вас от создания экземпляра объекта, чтобы получить простоту.