Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как объявить переменную с данными о пользователе вне классов, чтобы она была видна внутри классов?
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Как объявить переменную с данными о пользователе вне классов, чтобы она была видна внутри классов?

Страниц (1): [1]
 

1. Rooner - 14 Апреля, 2012 - 08:17:15 - перейти к сообщению
В самом начале каждой страницы сайта стоит авторизация пользователя $auth = new Auth(); В переменной $auth->user хранятся все данные о пользователе.
Каждая страница сайта это отдельный класс, в котором могут быть еще и дочерние классы. Проблема в том, что создав объект $auth вне классов я не могу обратиться к нему внутри класса страницы:

PHP:
скопировать код в буфер обмена
  1. $auth = new Auth();
  2. class Materials {
  3.   function __construct($title = "") {
  4.     echo $auth->user["status"]; // нет доступа
  5.   }
  6. }
  7. $page = new Materials("Материалы");
2. etoYA - 14 Апреля, 2012 - 09:17:37 - перейти к сообщению
Rooner пишет:
// нет доступа

Свойство $user публичное?

Попробуйте


Rooner пишет:
Каждая страница сайта это отдельный класс

И смысл так извращатся? А если страниц 100?

Делаете класс, а в нём методы....
3. Rooner - 14 Апреля, 2012 - 10:02:41 - перейти к сообщению
etoYA свойство $user публичное.
PHP:
скопировать код в буфер обмена
  1.     class Auth {
  2.      
  3.       public $user;
  4.      
  5.       function __construct() {
  6.         $this->user = "пользователь";
  7.       }
  8.     }
  9.     $auth = new Auth();
  10.    
  11.     echo $auth->user; // выводит пользователь
  12.    
  13.     class Materials {
  14.       function __construct() {
  15.         echo $auth->user; // ничего не выводит
  16.       }
  17.     }
  18.     $page = new Materials();


Ну как получить доступ к $auth->user; внутри класса?

etoYA пишет:
И смысл так извращатся? А если страниц 100?

Нуда, возможно извращение, но с другой стороны удобно сохранять данные в переменные класса, когда без использования класса их пришлось бы либо передавать в функции либо делать глобальными. Но это уже не по теме...
(Добавление)
Сделал с помощью статической переменной $user.
PHP:
скопировать код в буфер обмена
  1.     class Auth {
  2.       static $user;
  3.       function __construct() {
  4.         Auth::$user = "пользователь";
  5.       }
  6.     }
  7.     $auth = new Auth();
  8.    
  9.     echo "Global = ".Auth::$user."<br>"; // выводит пользователь
  10.    
  11.     class Materials {
  12.       protected $obj;
  13.       function __construct() {
  14.         echo "Materials = ".Auth::$user."<br>";
  15.         $this->obj = new Catalog;
  16.       }
  17.     }
  18.    
  19.     class Catalog {
  20.       function __construct() {
  21.         echo "Catalog = ".Auth::$user."<br>";
  22.       }
  23.     }
  24.    
  25.     $page = new Materials();
4. Bio man - 14 Апреля, 2012 - 11:31:09 - перейти к сообщению
можно было просто передать объект в конструктор или агрегировать в нужном методе....
5. Rooner - 14 Апреля, 2012 - 12:42:18 - перейти к сообщению
Bio man, к сожалению это слишком громоздко, даже если передавать указатель на объект, т.к. к переменной, с данными о пользователе, мне нужно обращаться во многих местах как в классах(в родительском, в дочерних) так и на самой странице(и на подключенных других страницах).
Вобщем в моем случае оптимальный выход это статическая переменная.
6. snikers987 - 14 Апреля, 2012 - 14:58:44 - перейти к сообщению
Может класс Auth сделать сиглтоном?

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class Auth {
  4.     public $user;
  5.     private static $__instanse = null;
  6.     private function __construct() {
  7.         $this->user = "пользователь";
  8.     }
  9.         private function __sleep(){}
  10.         private function __wakeup(){}
  11.         private function __clone(){}
  12.         static function getInstanse(){
  13.                 if(self::$__instanse !== null){
  14.                         return self::$__instanse;
  15.                 }else{
  16.                         return self::$__instanse = new Auth;
  17.                 }
  18.         }
  19. }
  20.    
  21.    
  22. class Materials {
  23.         public function __construct() {
  24.                 echo Auth::getInstanse()->user; // ничего не выводит
  25.         }
  26. }
  27. $page = new Materials();


я конечно могу ошибаться.
[/PHP]
7. DelphinPRO - 14 Апреля, 2012 - 15:06:23 - перейти к сообщению
snikers987 пишет:
Может класс Auth сделать сиглтоном?

конечно. если $auth по сути должна быть глобальной переменной, делайте класс синглтоном.

 

Powered by ExBB FM 1.0 RC1