Просто интересно, почему у нас есть предупреждение 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()
).
Я могу понять, почему включение необязательного параметра name не позволит появиться предупреждению. Функция Node :: create принимает 0 или 1 параметр любого типа (поскольку вы не использовали подсказки типов). Если вы сделаете параметр name необязательным в NamedNode :: create, он принимает 0, 1 или 2 параметра, опять же, любого типа. Это означает, что все действительные сигнатуры вызовов для Node :: create также действительны для NamedNode :: create. Вы только добавляете дополнительную возможность, но это не может сломать старый код.
Очевидно, что можно вызвать статическую функцию в экземпляре, что является причиной того, что это предупреждение отображается даже для статических функций. Смотрите также https://3v4l.org/FPEUj
Просто интересно, почему у нас есть предупреждение 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()
).
Я могу понять, почему включение необязательного параметра name не позволит появиться предупреждению. Функция Node :: create принимает 0 или 1 параметр любого типа (поскольку вы не использовали подсказки типов). Если вы сделаете параметр name необязательным в NamedNode :: create, он принимает 0, 1 или 2 параметра, опять же, любого типа. Это означает, что все действительные сигнатуры вызовов для Node :: create также действительны для NamedNode :: create. Вы только добавляете дополнительную возможность, но это не может сломать старый код.
Очевидно, что можно вызвать статическую функцию в экземпляре, что является причиной того, что это предупреждение отображается даже для статических функций. Смотрите также https://3v4l.org/FPEUj