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

Какова точка объявления статических функций в PHP?

Итак, в PHP вы можете иметь

Class A{
   function B(){}
}

и вы можете вызвать это, как если бы это была статическая функция:

A::B();

Мой вопрос: если я могу это сделать, тогда почему я должен объявлять функцию B() статичной, поскольку делает это недоступным, так что там меньше гибкости, поэтому у вас есть все, чтобы проиграть, но ничего не сделать получить...

или есть ли преимущество объявления функции как статической, о которой я не знаю?

также я слышал, что "статический вызов нестатических методов" "устарел"... что это точно означает особенно в отношении этого сценария? вызывает A::B(), когда B() не объявляется статическим, что я не должен делать? если да, то почему это так?

4b9b3361

Ответ 1

Потому что PHP имеет тенденцию быть немного рыхлым-goosy вокруг строгости (?), эти вещи работают. Тот факт, что они устарели, означает, что когда-то в будущей версии, скорее всего, не работать больше. Поэтому, если вы вызываете нестатистическую функцию в статическом контексте, ваша программа может ломаться в будущем обновлении PHP.

Что касается его использования прямо сейчас - преимущество объявления функции как статического заключается в том, что вы решаете, как именно эта функция должна использоваться. Если вы намерены использовать функцию в статическом контексте, вы все равно не можете использовать $this, поэтому вам лучше понять, что вы планируете делать. Если вы хотите использовать функцию статически, сделайте ее статичной. Если вы этого не сделаете, тогда не делайте этого. Если вы хотите использовать функцию как статически, так и не статически, пожалуйста, перепроверить свои требования: P

Ответ 2

В режиме совместимости. Теперь вызов нестатических методов статически генерирует предупреждение уровня E_STRICT.

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

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

Совет: если вы предусмотрели методы вызова, статически их также определяют; -)

Ответ 3

Во-первых, вы не могли бы делать такие вещи в своем посте на строгом типизированном языке, таком как Java. Java-код не компилируется, если вы вызываете нестатические вещи в статическом контексте. PHP не настолько строг в отношении этих вещей (пока), но все же вы не должны делать что-то только потому, что можете, хотя это плохая практика и на некоторых языках даже "неправильная" практика.

Уверены преимущества использования статических методов. И это не совсем правильно, что вы ничего не получаете или даже не теряете гибкость. Возьмем пример:

class A {

  private static $prop_a = 'property_a';

  public static function b() {
    echo 'called b()';
    echo self::$prop_a;

    $A = new A();
    $A->c();
  }

  public function c() {
    echo 'called c()';
  }
}

Теперь мы можем вызвать класс следующим образом:

A::b();

который выводит

  • called_b
  • property_a
  • called_c

Но вы можете сделать то же самое:

$a = new A();
$a->b();
$a->c();

c() выполняется дважды, но вы получаете эту идею. Внутри вашего класса вы можете инициировать сам класс и работать с ним, как с обычным объектом. Но извне это просто одна строка кода, в то время как 3 строки используют нестатический путь. Довольно круто, да?

И как вы видите, вы можете использовать статическую функцию в нестационарном контексте, а это значит, вы можете объявить свой статический метод, но если вы создадите свой класс, вы можете просто называть его обычным методом. Звучит довольно гибко для меня;)

И нет, вы не можете использовать $this в статическом контексте, но для чего self для;)

Ответ 4

Если это статическая функция, вам не нужно создавать экземпляр класса, чтобы использовать этот метод.

Class A {
  static function hello($arg)
  {
    echo 'Hello, ' . $arg;
  }
}

A::hello('world');

VS

Class A {
  public function hello($arg)
  {
    echo 'Hello, ' . $arg;
  }
}

$a = new A;
$a->hello('world');

Важное значение здесь - создание объекта. После того как вы создали экземпляр объекта, его можно манипулировать, и вызов методов может привести к неожиданным результатам. Если ваши значения и функции статически объявлены в классе, они не могут быть изменены во время вызова функции.

Это не означает, что вы всегда должны использовать статические методы. возьмите следующий пример.

class My_math {
  static function pi()
  { 
   return 3.14
  }
}

class My_bakery {
  private var $pie;  

  function set_pie($pie)
  {
    $this->pie = $pie;
  }
  function pie()
  {
    echo "I made you a " . $this->pie . "pie";
  }
}

Я заставил My_Math вернуть постоянное значение, потому что я знаю, что pi не изменяется. Но в My_bakery, в некоторые дни мне нужен пирог с голубикой, а в некоторые дни я хочу персиковый пирог.