какой смысл объявлять статические функции в PHP? - PullRequest
13 голосов
/ 10 августа 2011

Так что в PHP вы можете иметь

Class A{
   function B(){}
}

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

A::B();

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

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

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

Ответы [ 4 ]

11 голосов
/ 10 августа 2011

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

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

1 голос
/ 10 августа 2011

Во-первых, вы не могли делать такие вещи в своем посте на строго типизированном языке, таком как 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;)

1 голос
/ 10 августа 2011

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

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

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

Совет.их тоже; -)

0 голосов
/ 10 августа 2011

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

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 иногда хочется черничного пирога, а иногда - персикового.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...