Почему получаю ошибку в этом сценарии?
<?php
class A
{
public function a($at)
{
echo $at;
}
public function b()
{
echo 'Test';
}
}
$ac = new A();
$ac->b();
Получаю ошибку: Uncaught ArgumentCountError: Too few arguments to function A::a(), 0 passed
Я же не вызываю этот метод...
Ответы (2 шт):
Если смотреть на версию PHP 7.4.x и старше, то, помимо данной ошибки, будет выводиться и следующее:
Deprecated: Methods with the same name as their class will not be constructors
in a future version of PHP; A has a deprecated constructor in
/home/user/scripts/code.php on line 3
Fatal error: Uncaught ArgumentCountError: Too few arguments to function A::a(),
0 passed in /home/user/scripts/code.php on line 16 and exactly 1 expected in
/home/user/scripts/code.php:5
Stack trace:
#0 /home/user/scripts/code.php(16): A->a()
#1 {main}
thrown in /home/user/scripts/code.php on line 5
Это означает, что данная версия будет считать метод a() как конструктор класса A — да, регистр здесь неважен. Ранее, с PHP 5.3.3, при попытке выводе данного метода выводилось предупреждение о скором снятии данной фичи, что и было сделано в PHP 8.x.
Я предлагаю два варианта:
- Перейти на
PHP 8.x; - Заменить имя метода на какое-нибудь другое, не равное 'a' или 'A'
Тут проблема отчасти php.
Видимо при разборе парсер приводит имя класса к нижнему регистру и в итоге получается, что вызывается конструктор. В ранних версиях PHP конструктор объявлялся с таким же именем, как сам класс. Потом это устарело и рекомендовано было использовать __construct.
Как итог, сейчас в текущем коде метод a понимается как конструктор. Отсюда и ошибка. Если назовёте его по-другому - ошибка исчезнет.
С версии 8.0 это тоже починили