PHP сигнатура метода не имеет параметров У вызова метода есть один параметр без предупреждения - PullRequest
1 голос
/ 16 февраля 2020

Здравствуйте. Я пытаюсь создать простой класс, в котором есть метод без параметров. При вызове метода я добавляю один параметр для провала теста, но тест проходит. И если я запускаю код в браузере, все работает без предупреждения. Я нахожусь в среде разработки, поэтому php должен обнаруживать такие нарушения.

Это сигнатура метода

    public function getServiceDetail(): ServiceDetail
    {
        ...
    }

Это вызов

...

$this->repository->getServiceDetail(1);

...

Результат все вышеперечисленное прекрасно, я получаю подробности из логики c, которая в методе не содержит предупреждений или ошибок.

Редактировать: если я поставил неправильный тип в сигнатуру метода, я получаю правильную ошибку, так как У меня strict_types вкл.

1 Ответ

2 голосов
/ 16 февраля 2020

PHP не заботится об этом, потому что все функции php по своей природе разнообразны c. Вот почему существует func_get_args. Все, что вы передаете php функции / методу, считается действительным, если иное явно не определено как недействительное. Другими словами, вы должны определить прототип, и вызов должен затем явно опровергнуть этот прототип, поскольку он считается недействительным.

Например:

function foo(Array $bar, String $baz) {
    var_dump(func_get_args());
}

foo([1], "quix", new stdclass); // is perfectly legal in php

Вы получаете

array(3) {
  [0]=>
  array(1) {
    [0]=>
    int(1)
  }
  [1]=>
  string(4) "quix"
  [2]=>
  object(stdClass)#1 (0) {
  }
}

Из руководства :

PHP есть поддержка списков аргументов переменной длины в пользовательских функциях. Это реализовано с использованием токена ... в PHP 5.6 и более поздних версиях и с использованием функций func_num_args(), func_get_arg() и func_get_args() в PHP 5.5 и более ранних версиях.

...