Расширенный PHP-класс и общедоступные статические методы с одинаковыми именами должны иметь совместимые подписи

Просто интересно, почему у нас есть предупреждение E_STRICT / E_WARNING здесь:

class Node
{
public static function create($parent = null)
{
// ...
}
}

class NamedNode extends Node
{
public static function create($name, $parent = null)
{
// ...
}
}

Как вы можете видеть в http://3v4l.org/n1s38, у нас есть E_STRICT (PHP < 7) или E_WARNING (PHP ≥ 7).
Я действительно не вижу никакой причины для этого …

Кроме того, если мы сделаем $name аргумент необязательный (http://3v4l.org/V1WHC), предупреждение не выдается …
И это смущает меня еще больше: если сигнатуры методов должны быть одинаковыми (и, как я уже сказал выше, я удивляюсь, почему), почему не выдается предупреждение?

РЕДАКТИРОВАТЬ: это не дубликат Почему переопределение параметров метода является нарушением строгих стандартов в PHP? так как здесь речь идет о статических методах. Я думаю, что нестатические методы должны иметь одинаковую сигнатуру (поскольку в этом случае мы будем работать с экземплярами), но статические методы очень разные: мы вызываем метод статически, поэтому мы знаем класс, который вызывается (например, Node::create() или же NamedNode::create()).

2

Решение

Я могу понять, почему включение необязательного параметра name не позволит появиться предупреждению. Функция Node :: create принимает 0 или 1 параметр любого типа (поскольку вы не использовали подсказки типов). Если вы сделаете параметр name необязательным в NamedNode :: create, он принимает 0, 1 или 2 параметра, опять же, любого типа. Это означает, что все действительные сигнатуры вызовов для Node :: create также действительны для NamedNode :: create. Вы только добавляете дополнительную возможность, но это не может сломать старый код.

Очевидно, что можно вызвать статическую функцию в экземпляре, что является причиной того, что это предупреждение отображается даже для статических функций. Смотрите также https://3v4l.org/FPEUj

1

Другие решения

Просто интересно, почему у нас есть предупреждение E_STRICT / E_WARNING здесь:

class Node
{
public static function create($parent = null)
{
// ...
}
}

class NamedNode extends Node
{
public static function create($name, $parent = null)
{
// ...
}
}

Как вы можете видеть в http://3v4l.org/n1s38, у нас есть E_STRICT (PHP < 7) или E_WARNING (PHP ≥ 7).
Я действительно не вижу никакой причины для этого …

Кроме того, если мы сделаем $name аргумент необязательный (http://3v4l.org/V1WHC), предупреждение не выдается …
И это смущает меня еще больше: если сигнатуры методов должны быть одинаковыми (и, как я уже сказал выше, я удивляюсь, почему), почему не выдается предупреждение?

РЕДАКТИРОВАТЬ: это не дубликат Почему переопределение параметров метода является нарушением строгих стандартов в PHP? так как здесь речь идет о статических методах. Я думаю, что нестатические методы должны иметь одинаковую сигнатуру (поскольку в этом случае мы будем работать с экземплярами), но статические методы очень разные: мы вызываем метод статически, поэтому мы знаем класс, который вызывается (например, Node::create() или же NamedNode::create()).

2

Я могу понять, почему включение необязательного параметра name не позволит появиться предупреждению. Функция Node :: create принимает 0 или 1 параметр любого типа (поскольку вы не использовали подсказки типов). Если вы сделаете параметр name необязательным в NamedNode :: create, он принимает 0, 1 или 2 параметра, опять же, любого типа. Это означает, что все действительные сигнатуры вызовов для Node :: create также действительны для NamedNode :: create. Вы только добавляете дополнительную возможность, но это не может сломать старый код.

Очевидно, что можно вызвать статическую функцию в экземпляре, что является причиной того, что это предупреждение отображается даже для статических функций. Смотрите также https://3v4l.org/FPEUj

active «data-shortcut =» A
самый старый «data-shortcut =» O
голосует «data-shortcut =» V
1
По вопросам рекламы [email protected]