Почему Yii вызывает метод login () при создании модели входа в систему

Следуя моему предыдущему вопросу , я обнаружил, что в каждом из моих проектов Yii (где код входа был автоматически сгенерирован Yii при первоначальном создании приложения и не изменен мной), Yii выполняет метод login() из модели формы Login , когда эта модель создано. Зачем? В чем цель?

Я проанализировал пошаговое выполнение потока приложений (с NetBeans + XDebug + NetBeans Connector), и кажется, что при создании Login model / class ( $model = new Login; ) Yii автоматически CFormModel два класса ( Login и CFormModel ) и сразу после загрузки второго, он переходит непосредственно к выполнению метода login() . Никаких шагов.

Это поток приложений, который я наблюдал (я всегда использую Step Into (F7) в Netbeans):

  1. $model = new Login; в actionLogin() (поскольку Yii::app()->user->isGuest – это true ).

  2. if(isset(self::$classMap[$className])) autoload() в YiiBase.php ( autoload() в YiiBase.php (строка 396).

  3. if(strpos($className,'\\')===false) в том же методе (строка 403).

  4. if(self::$enableIncludePath===false) как указано выше (строка 405).

  5. { ниже начала class Login extends CFormModel определение class Login extends CFormModel .

  6. То же, что и в пункте 2. выше.

  7. { ниже начала class CFormModel extends CModel определение class CFormModel extends CModel .

  8. return true; в autoload($className) в YiiBase.php (строка 435).

  9. return class_exists($className,false) || interface_exists($className,false); в том же методе (строка 433).

  10. 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.