Следуя моему предыдущему вопросу , я обнаружил, что в каждом из моих проектов Yii (где код входа был автоматически сгенерирован Yii при первоначальном создании приложения и не изменен мной), Yii выполняет метод login()
из модели формы Login
, когда эта модель создано. Зачем? В чем цель?
Я проанализировал пошаговое выполнение потока приложений (с NetBeans + XDebug + NetBeans Connector), и кажется, что при создании Login
model / class ( $model = new Login;
) Yii автоматически CFormModel
два класса ( Login
и CFormModel
) и сразу после загрузки второго, он переходит непосредственно к выполнению метода login()
. Никаких шагов.
Это поток приложений, который я наблюдал (я всегда использую Step Into (F7)
в Netbeans):
$model = new Login;
в actionLogin()
(поскольку Yii::app()->user->isGuest
– это true
).
if(isset(self::$classMap[$className]))
autoload()
в YiiBase.php
( autoload()
в YiiBase.php
(строка 396).
if(strpos($className,'\\')===false)
в том же методе (строка 403).
if(self::$enableIncludePath===false)
как указано выше (строка 405).
{
ниже начала class Login extends CFormModel
определение class Login extends CFormModel
.
То же, что и в пункте 2. выше.
{
ниже начала class CFormModel extends CModel
определение class CFormModel extends CModel
.
return true;
в autoload($className)
в YiiBase.php
(строка 435).
return class_exists($className,false) || interface_exists($className,false);
в том же методе (строка 433).
if($this->_identity === NULL)
в методе login()
в модели Login
(класс).
( все строки относятся к классу YiiBase.php
)
Может ли кто-нибудь объяснить мне, почему Yii выполняет метод login()
при создании модели формы Login
?
Более подробно – в чем заключается цель попытки входа в систему пользователя, если нет данных, которые могут быть использованы в процессе входа в систему – $this->login
и $this->password
имеют значение null, не было никакой формы, поэтому у пользователя нет возможности вводить что-либо, данные POST не были отправлены ( $_POST
пуст, $_POST['Login']
не определен)?
После этого лучше всего. Если вы запустите приложение (это или любое автоматическое сгенерированное Yii с неизменным кодом входа), ничего не происходит – Yii правильно отображает регистрационную форму, хотя попытка входа в систему, при которой выполняется рендеринг, не удалось. Но, если вы отлаживаете приложение поэтапно, форма не создается, поток приложений завершается, и выполнение скриптов умирает: Property "CWebApplication._identity" is not defined
а Property "CHttpSession._identity" is not defined
исключениями. Что-то, чего мы можем ожидать, поскольку CWebApplication._identity
в этом контексте не определена.
Может кто-нибудь объяснить мне, что здесь происходит?
Так как Name
моей модели – это Login
, то метод login()
определенный в нем, действует для PHP как конструктор.
Это не имеет ничего общего с Yii, это базовое поведение PHP, унаследованное от старого, плохого PHP4 и разрозненное с PHP 5.3.3 только в случае классов с именами. Когда определение класса не использует пространство имен, это поведение (определение конструктора как функции, названного так же, как класс) остается в силе.
См. Этот ответ для получения дополнительной информации или обратитесь к руководству по PHP.