Я столкнулся с проблемой, что моя функция вызывается дважды каждый раз, когда я отправляю свою форму
мой файл формы с вызовом функции:
<?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()
, главным образом, чтобы помочь с наследованием.
Дополнительные материалы для чтения:
Имя вашего класса – логин. У вас нет __construct()
, и у вас есть функция login()
. Поэтому, когда вы создаете экземпляр класса, login()
вызывается первым, так как вы не определяете __construct()
, имя метода такое же, как класс становится конструктором. Затем вы снова вызываете функцию login()
. Следовательно, его называют дважды.
Когда вы создаете класс, вы должны указать конструктор.
Если вы не укажете конструктор, его вызывают Magic Methods.
В вашем случае вы создаете класс без конструктора с помощью функции с тем же именем класса. Вход в класс -> Вход в систему. Действия PHP, такие как метод входа, – это ваш конструктор …
Поэтому, когда вы вызываете $ login = new Login (), вы вызываете конструктор, который является методом Login.
И когда вы вызываете метод входа, $ login-> login (), вы вызываете его дважды.
Вы поняли?
Вы вызываете один раз функцию с конструктором, второй раз вручную. В PHP 5.3.3, если вы называете функцию подобно классу, это конструктор.
В PHP 4 конструктор класса имел то же имя, что и класс. Когда в PHP 5 были добавлены деструкторы, была добавлена схема именования __construct()
, однако старый способ продолжал работать по соображениям совместимости.
В вашем случае это означает, что login()
сначала будет вызываться как конструктор, а затем из явного вызова