PHP – OOP – Почему моя функция называется дважды?

Я столкнулся с проблемой, что моя функция вызывается дважды каждый раз, когда я отправляю свою форму

мой файл формы с вызовом функции:

<?php require "classes/loginClass.php"; $login = new login; $login->login(); ?> <form action="" method="POST"> <label for="username">username: </label> <input type="text" id="username" name="username" required><br/> <label for="password2">password: </label> <input type="password" id="password2" name="password2" required><br/> <input type="submit" name="submit" value="login"> </form> 

мой класс и функция:

 class login { public function login() { if(isset($_POST['submit'])){ echo "submit"; } } } 

Поэтому каждый раз, когда я нажимаю кнопку «Отправить», «отправить» получает эхо дважды. Это означает, что моя функция вызывается дважды. Я не понимаю, почему.

Метод, названный так же, как класс, считается конструктором (старый стиль) и вызывается каждый раз, когда объект создается.

Поэтому он вызывается один раз, когда объект создается, и в другое время, когда вы его явно вызываете.

Обратите внимание, что сегодня считается лучшей практикой реализовать __construct() а не ClassName() , главным образом, чтобы помочь с наследованием.


Дополнительные материалы для чтения:

  • PHP – конструкторы и деконструкторы
  • PHP – Конструкторы старого стиля

Имя вашего класса – логин. У вас нет __construct() , и у вас есть функция login() . Поэтому, когда вы создаете экземпляр класса, login() вызывается первым, так как вы не определяете __construct() , имя метода такое же, как класс становится конструктором. Затем вы снова вызываете функцию login() . Следовательно, его называют дважды.

Когда вы создаете класс, вы должны указать конструктор.

Если вы не укажете конструктор, его вызывают Magic Methods.

В вашем случае вы создаете класс без конструктора с помощью функции с тем же именем класса. Вход в класс -> Вход в систему. Действия PHP, такие как метод входа, – это ваш конструктор …

Поэтому, когда вы вызываете $ login = new Login (), вы вызываете конструктор, который является методом Login.

И когда вы вызываете метод входа, $ login-> login (), вы вызываете его дважды.

Вы поняли?

Вы вызываете один раз функцию с конструктором, второй раз вручную. В PHP 5.3.3, если вы называете функцию подобно классу, это конструктор.

В PHP 4 конструктор класса имел то же имя, что и класс. Когда в PHP 5 были добавлены деструкторы, была добавлена ​​схема именования __construct() , однако старый способ продолжал работать по соображениям совместимости.

В вашем случае это означает, что login() сначала будет вызываться как конструктор, а затем из явного вызова