Yii::app()->user->getName() или ...->name ?

В API документации в классе CWebUser, экземпляр которого доступен как-

Yii::app()->user

в разделе Public Properties приводится свойство name.

На самом деле такое свойство - public $name в этом классе не определяется.

Как так получается, что это свойство доступно как

Yii::app()->user->name, будто бы в этом классе действительно есть определение public $name

хотя по всем правилам его можно получить только так

Yii::app()->user->getName()

У кого есть время, объясните, пожалуйста.

С уважением - Новичек.


Извиняюсь, разобрался, слабо знаю PHP:

Overloading

Overloading in PHP provides means to dynamically "create" properties and methods


С другой стороны, почему бы просто не объявить:

public $name ?

Тем более, что и свойство получается какое-то не полноценное -

когда делаешь распечатку

print_r(Yii::app()->user)

это свойство name, в распечатке не фигурирует. Я сначала подумал, что это свойство static.

Как на мой неграмотный взгляд, PHP грешит излишней избыточностью.

Глаза разбегаются, и ноги разъезжаются…

Дело в том, что getName() содержит в себе логику и объявляется следующим образом:




public function getName()

{

    if(($name=$this->getState('__name'))!==null)

        return $name;

    else

        return $this->guestName;

}



Не обязательно знать, что делает этот код (я лишь сделал копи-паст), важно то, что простое объявление public $name здесь не подойдет. В создании защищенного поля $name здесь, видимо, необходимости нет. Но это уже тонкости реализации и наглядный пример инкапсуляции. Вас, я так полагаю, интересует больше философская сторона вопроса и то, почему пхп такой нестрогий язык и позволяет творить подобные вещи :) Уж какой есть…

Коль скоро вы откликнулись, может быть найдете время разъяснить на человеческом языке-

что такое виджет ?

Общая картина с yii, в общем-то, начинает потихоньку проясняться.

На настоящий момент два темных пятна:

  1. виджет

  2. такая вот штука $_POST[‘ajax’] - вроде как js-скрипт немедленно

    обращается на сервер за валидизацией отдельного поля, но как это реализовано технически-не пойму,

    хоть ты тресни…

С уважением - Новичек.

Про виджеты есть небольшая глава в документации. С помощью виджетов создаются такие элементы интерфейса, как последние новости, популярные статьи, облако тегов и т.д.

AJAX - это вообще отдельная тема. Можете поискать информацию на эту тему в гугле :) Как правило, библиотека jQuery, написанная на JavaScript, посылает запрос серверу, тот что-то делает, а затем отправляет ответ обратно. JavaScript реагирует на ответ и изменяет что-то на странице. Переменная ajax в Yii используется для того, чтобы различать разные запросы.

"Про виджеты есть небольшая глава в документации…"

Разумеется, это я читал, но абсолютно ничего не понял…

Вот если бы был какой-нибудь простенький пример, постановка задачи в котором

начиналась бы человеческими словами, примерно такими - "предположим нам требуется вывести в браузер то-то и то-то…"

Видимо, придется пока отложить эти темы…

С уважением - Новичек

Вот простая задача: вывести последние новости.

components/LastNews.php:




class LastNews extends CWidget

{

    public function run()

    {

        $models = News::model()->recent()->findAll();

        

        $this->render('lastNews', array(

            'models'=>$models,

        ));

    }

}



В папке components/views создается представление lastNews.php, где выводятся последние новости. Затем в макете используется метод $this->widget(‘application.components.LastNews’) для показа виджета.

Как мне обьяснили на этом форуме - Виджет это своего рода маленький контроллер который имеет собственный View.

таким обраом мы можем выводить 2-3 отображения на одну страницу с помошью виджетов.

например двухколоночный дизайн.

вверху основное меню (контроллер)

в левой колонке меню какое-то дополнительное (виджет)

а в правой сам контент от контроллера основного.

надеюсь что понятно обьяснил своимо словами :)

искал в апи метод recent(). его там нет

В API его и не может быть, метод создается динамически через «Именованные группы условий», могут быть еще и другие, более сложные варианты правда.

Грубо говоря, это части SQL запроса, которые могут быть использованы для построения любого запроса дальше. Могут использоваться даже цепочкой, например News::model()->recent()->enabled()->sortByDate()->findAll() и т.д.

А по поводу вопроса топика: в PHP можно перехватить вызов несуществующего метода или обращение к несуществующему свойству объекта. Вот так и делается. Перехватывается вызов «name» и вместо него выполняется «getName».

Ну и про автоматизацию, насколько я понял, все наследуемые классы имеют поддержку геттеров и сеттеров, т.е. если заводим метод «getValue», то этот метод будет доступен через «$object->value».

ksavelyev благодарствую! отлично указал на нужную инфу