Следуя моему предыдущему вопросу , я обнаружил, что в каждом из моих проектов 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.