Почему получаю ошибку в этом сценарии?

<?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 шт):

Автор решения: 4500zenja

Если смотреть на версию 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.

Я предлагаю два варианта:

  1. Перейти на PHP 8.x;
  2. Заменить имя метода на какое-нибудь другое, не равное 'a' или 'A'
→ Ссылка
Автор решения: Алексей Шиманский

Тут проблема отчасти php.

Видимо при разборе парсер приводит имя класса к нижнему регистру и в итоге получается, что вызывается конструктор. В ранних версиях PHP конструктор объявлялся с таким же именем, как сам класс. Потом это устарело и рекомендовано было использовать __construct.

Как итог, сейчас в текущем коде метод a понимается как конструктор. Отсюда и ошибка. Если назовёте его по-другому - ошибка исчезнет.

С версии 8.0 это тоже починили

→ Ссылка