Подтвердить что ты не робот

Статические переменные в PHP

Я нашел различную информацию о статических переменных в PHP, но ничего, что на самом деле не объясняет, что это такое и как оно работает.

Я прочитал, что при использовании внутри класса статическое свойство не может использоваться каким-либо объектом, созданным этим классом, и что статический метод может использоваться объектом, созданным классом?

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

4b9b3361

Ответ 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

Ссылка: static ключевое слово (в классах), (в функциях)

Ответ 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;`