Действительно ли возможно злоупотребить последнее статическое связывание в PHP?

Вставление оператора импорта функции может предотвратить круговые зависимости. Например, если у Вас будет 2 модуля, X.py и Y.py и они оба потребность импортировать друг друга, это вызовет круговую зависимость при импорте одного из модулей, вызывающих бесконечный цикл. При перемещении оператора импорта в один из модулей тогда, это не попытается импортировать другой модуль, пока функция не будет вызвана, и тот модуль будет уже импортирован, таким образом, никакой бесконечный цикл. Читайте здесь для более - effbot.org/zone/import-confusion.htm

14
задан hakre 18 April 2013 в 17:01
поделиться

2 ответа

Итак, чтобы подвести итог, можно ли сказать, что такое (и подобное) использование позднего статического связывания является излишним? Есть ли заметное снижение производительности? Кроме того, снижает ли частое использование позднего связывания общее повышение производительности, обеспечиваемое кешами опкодов?

Введение позднего статического связывания устраняет недостаток в объектной модели PHP. Дело не в производительности, а в семантике.

Например, мне нравится использовать статические методы, когда реализация метода не использует $ this . То, что метод статичен, не означает, что вы не хотите иногда его переопределять. До PHP 5.3 поведение заключалось в том, что при переопределении статического метода ошибка не отмечалась, но PHP просто продолжал и молча использовал родительскую версию. Например, приведенный ниже код печатает "A" до PHP 5.3. Это очень неожиданное поведение.

Позднее статическое связывание исправляет это, и теперь тот же код печатает «B».

<?php
class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    static::who();
  }
}

class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}

B::test();
?>
16
ответ дан 1 December 2019 в 13:09
поделиться

статические методы (с ранним или поздним связыванием) создают тесную связь и (таким образом) снижают тестируемость. вы можете создавать большие программы на PHP, не используя более нескольких статических вызовов. для меня поздние статические методы не являются особенностями.

отредактируйте , чтобы ответить на вопрос Марко Демайо, как статический метод снижает тестируемость?

извините, если вам все это очевидно, статические члены (как данные, так и методы) полезны и не причиняют вреда, если используются ответственно, я имел в виду их распространенное неправильное использование.

скажем, у вас есть веб-приложение, использующее базу данных SQL. ваши бизнес-объекты могут получать данные, используя статический интерфейс или полиморфизм. либо

class MyBusinessObject
extends...
{
  public function doThisOrThat(...)
  {
    $results = db::query('sql string...');
    ...
  }
}

, либо

class MyBusinessObject
extends...
{
  public function __construct(dbconn $db)
  {
    $this->db = $db;
  }
  private $db;
  public function doThisOrThat(...)
  {
    $results = $this->db->query('sql string...');
    ...
  }
}

последнее легче проверить (например: я хочу проверить, что строка sql, построенная из таких-то входных данных, является такой-то и такой-то), потому что проще создать другую реализацию интерфейса dbconn , чем изменить значение ] db :: . зачем тебе тоже? потому что вам не нужна настоящая база данных для тестирования поведения при составлении sql, и на самом деле проще проверить без реальной базы данных. Кроме того, проще отключить потребителя sql, если ваши тесты связаны с другим аспектом CUT (Code Under Test).

тестирование всегда подразумевает ложь тестируемому коду о его сотрудниках и воздержание от статических интерфейсов (" doublecolon "или" quadridot ") означает, что ложь не должна быть масштабной операцией, что является плюсом, поскольку чем дальше тестируемый код находится от производственного кода, тем менее значимы результаты тестирования.

3
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: