Статические переменные в PHP
Я нашел различную информацию о статических переменных в PHP, но ничего, что на самом деле не объясняет, что это такое и как оно работает.
Я прочитал, что при использовании внутри класса статическое свойство не может использоваться каким-либо объектом, созданным этим классом, и что статический метод может использоваться объектом, созданным классом?
Тем не менее, я пытался исследовать, что статическая переменная делает внутри функции, которая не находится в классе. Кроме того, статическая переменная внутри функции работает как закрытие в javascript, или я полностью отключаюсь в этом предположении?
Ответы
Ответ 1
Я читал, что при использовании внутри класса статическое свойство не может использоваться каким-либо объектом, созданным этим классом
Это зависит от того, что вы подразумеваете под этим. например:
class Foo {
static $my_var = 'Foo';
}
$x = new Foo();
echo $x::$my_var; // works fine
echo $x->my_var; // doesn't work - Notice: Undefined property: Foo::$my_var
и что статический метод может использоваться объектом, созданным классом???
Да, экземпляр объекта, принадлежащий классу, может получить доступ к статическому методу.
Ключевое слово static
в контексте классов ведет себя как статические переменные класса на других языках. Объявленный static
член (метод или переменная) связан с классом, а не с экземпляром этого класса. Таким образом, вы можете получить к нему доступ без экземпляра класса (например: в приведенном выше примере я мог бы использовать Foo::$my_var
)
Тем не менее, я пытался исследовать, что статическая переменная делает внутри функции, которая не находится в классе.
Кроме того, статическая переменная внутри функции работает как закрытие в javascript, или я полностью отключаюсь в этом предположении.
Вне классов (т.е. в функциях) переменная static
- это переменная, которая не теряет своего значения при выходе из функции. Так что в смысле, да, они работают как замыкания в JavaScript.
Но в отличие от JS-замыканий, существует только одно значение для переменной, которое поддерживается в разных вызовах одной и той же функции. Из примера руководства PHP:
function test()
{
static $a = 0;
echo $a;
$a++;
}
test(); // prints 0
test(); // prints 1
test(); // prints 2
Ответ 2
static
имеет два применения в PHP:
Во-первых, и чаще всего его можно использовать для определения переменных/функций класса (в отличие от переменных/функций экземпляра), к которым можно получить доступ без создания экземпляра класса:
class A {
public static $var = 'val'; // $var is static (in class context)
public $other_var = 'other_val'; // non-static
}
echo A::$var; // val
echo A::$other_var // doesn't work (fatal error, undefined static variable)
$a = new A;
echo $a->var // won't work (strict standards)
echo $a->other_var // other_val
Во-вторых, он может использоваться для поддержания состояния между вызовами функций:
function a() {
static $i = 0;
$j = 0;
return array($i++, $j++);
}
print_r(a()); // array(0, 0)
print_r(a()); // array(1, 0)
print_r(a()); // array(2, 0)
//...
Обратите внимание, что объявление переменной static внутри функции работает одинаково независимо от того, определена или нет функция в классе, все, что имеет значение, - это то, где объявлена переменная (член класса или функция).
Ответ 3
Статическая переменная в функции инициализируется только при первом вызове этой функции в ее запуске script.
Ответ 4
Сначала я объясню, что произойдет, если статическая переменная не будет использоваться
<?php
function somename() {
$var = 1;
echo $var . "<br />";
$var++;
}
somename();
somename();
somename();
?>
Если вы запустите вышеуказанный код, то вы получите 1 1 1. Поскольку каждый раз вы вызываете эту переменную функции, присваиваете ее 1, а затем печатаете ее.
Теперь посмотрим, что, если используется статическая переменная
<?php
function somename() {
static $var = 1;
echo $var . "<br />";
$var++;
}
somename();
somename();
somename();
?>
Теперь, если вы запустите этот фрагмент кода, вывод будет 1 2 3.
Примечание. Статический сохраняет свое значение и придерживается каждый раз, когда вызывается функция. Он не потеряет свое значение при вызове функции.
Ответ 5
class Student {
static $total_student = 0;
static function add_student(){
return Student::$total_student++;
}
}
Во-первых: для функции add_student наилучшей практикой является использование static not public.
Во-вторых: в функции add_student мы используем Student:: $total_student, не используем $this- > total_student. Это сильно отличается от обычной переменной.
В-третьих: статическая переменная совместно используется в дереве наследования.
введите ниже код, чтобы узнать, что является результатом:
class One {
static $foo ;
}
class Two extends One{}
class Three extends One{}
One::$foo = 1;
Two::$foo = 2;
Three::$foo = 3;
echo One::$foo;
echo Two::$foo;
echo Three::$foo;`