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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Доступ к внешним переменным/константам внутри класса

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
TuX560
Отправлено: 23 Декабря, 2015 - 08:29:45
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Добрый день, возник вопрос, есть ли возможность использовать переменную/константу объявленную вне класса внутри класса?

upd. уже разобрался
PHP:
скопировать код в буфер обмена
  1. $a = 5;
  2.  
  3. class b
  4. {
  5.     public function c()
  6.     {
  7.         return $GLOBALS['a'];
  8.     }
  9. }

(Отредактировано автором: 23 Декабря, 2015 - 09:41:42)

 
 Top
Flash_PR
Отправлено: 23 Декабря, 2015 - 10:37:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 328
Дата рег-ции: Окт. 2013  
Откуда: Санкт-Петербург


Помог: 6 раз(а)




Это плохая практика.


-----
Умные мысли приходят тогда, когда все глупости уже сделаны...
 
My status
 Top
TuX560
Отправлено: 23 Декабря, 2015 - 11:49:33
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Flash_PR пишет:
Это плохая практика.
Буду рад любой критике, не так давно взялся за php, но что в этом плохого? Использование глобальных переменных?

У меня ситуация следующая, написан свой собственный класс для соединения с БД. Что бы он знал куда подключаться использую $config = require_once 'config.php'; после чего в $config находится ассоциативный массив. Теперь мне нужно получить доступ к $config внутри методов класса. Объявлять внутри класса не стал тк в config.php содержится не только конфигурация подключения к БД, но и некоторые другие параметры, которые необходимы для работы других скриптов, поэтому что бы 2 раза не запрашивать config.php, при необходимости соединения с БД в другом скрипте, решил объявить рядом с классом. Прошу сильно за это не пинать, но другого решения пока не нашел, буду рад любым вариантам.
 
 Top
Sail
Отправлено: 23 Декабря, 2015 - 12:08:26
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




TuX560, вот так оно будет лучше, однако:
PHP:
скопировать код в буфер обмена
  1. $a = 5;
  2. class b
  3. {
  4.     public function c()
  5.     {
  6.         global $a;
  7.         return $a;
  8.     }
  9. }
 
 Top
TuX560
Отправлено: 23 Декабря, 2015 - 12:43:39
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Sail, благодарю, а в чем разница? Мельком просмотрев http://php.net/manual/ru/languag...iables.scope.php пока не заметил
 
 Top
Sail
Отправлено: 23 Декабря, 2015 - 13:52:30
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




TuX560 пишет:
а в чем разница?
Удобнее, однако... И использовать, и искать...
 
 Top
TuX560
Отправлено: 23 Декабря, 2015 - 14:09:25
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Sail пишет:
Удобнее, однако... И использовать, и искать...

Спасибо за ответ, Вы правы, об этом не задумался глядя на свою ситуацию. У себя думаю оставить обращение через глобальный массив, тк в классе обращение идет один раз в конструкторе для инициализации локальной переменной использующей лишь часть массива из $config.
 
 Top
Строитель Модератор
Отправлено: 23 Декабря, 2015 - 14:10:56
Post Id



Участник


Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 74 раз(а)




TuX560 пишет:
а в чем разница?
Никакой разницы нет.
 
 Top
DelphinPRO
Отправлено: 23 Декабря, 2015 - 17:00:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Класс должен быть максимально независимым от вне.

В вашем случае он зависит от переменной. Дадут мне ваш код поправить. Посмотрю я на этот global $a; и буду думать, что же за переменная такая, где она объявлена и т.д.

Гораздо лучше передать зависимость внутрь, при создании объекта

PHP:
скопировать код в буфер обмена
  1. class DB {
  2.  
  3.   /** @var Config */
  4.   private config;
  5.  
  6.  
  7.   public function __construct(Config $config) {
  8.     $this->config = $config;
  9.   }
  10.  
  11.   public function someMethod() {
  12.     $dbUser = $this->config->getUser();
  13.     $dbPass = $this->config->getPass();
  14.     // ...
  15.   }
  16. }


PHP:
скопировать код в буфер обмена
  1. $config = new Config();
  2. $config->load('config.php');
  3.  
  4. $db = new DB($config);
  5. $db->someMethod();


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
TuX560
Отправлено: 24 Декабря, 2015 - 09:34:35
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




DelphinPRO пишет:
Класс должен быть максимально независимым от вне.

В вашем случае он зависит от переменной. Дадут мне ваш код поправить. Посмотрю я на этот global $a; и буду думать, что же за переменная такая, где она объявлена и т.д.

Гораздо лучше передать зависимость внутрь, при создании объекта


Интуитивно я это понимаю, но желание упростить работу с бд и чтобы каждый раз не подключать по 2 файла(один с настройками другой с классом и при создании передавать конфиг) а обойтись
PHP:
скопировать код в буфер обмена
  1. require_once 'db.php';
  2. $db = new DB();

получается такая ерунда... Автозагрузку и пространства имен пока не осилил, особенно запутался с PSR-0, поэтому пока как-то так. Благодарю за пример, когда займусь рефакторингом и оптимизацией по мере изучения php буду иметь ввиду Ваш совет.

Конфигурацию для подключения получаю $config = require_once 'config.php'; рядом с классом, а в config.php примерно следующее:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. return array(
  3.     'db' => array(
  4.         '0' => array(
  5.             'host' => 'host',
  6.             'user' => 'user',
  7.             'pass' => 'pass'
  8.         ),
  9.         '1' => array(
  10.             'host' => 'host2',
  11.             'user' => 'user2',
  12.             'pass' => 'pass2'
  13.         )
  14.     ),
  15.     'some_other_config' => array(
  16.     ...
  17.     )
  18. );
  19.  
 
 Top
Sail
Отправлено: 24 Декабря, 2015 - 10:01:10
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




TuX560 пишет:
чтобы каждый раз не подключать по 2 файла

На этот случай есть Автоматическая загрузка классов
(Добавление)
Ну да... дочитал вторую часть сообщения... Улыбка
Но автозагрузка очень сильно облегчает жизнь.
Даже если использовать простенький автолоадер под конкретный проектик...
 
 Top
TuX560
Отправлено: 24 Декабря, 2015 - 13:34:57
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




Sail пишет:
Но автозагрузка очень сильно облегчает жизнь.
Даже если использовать простенький автолоадер под конкретный проектик...

Согласен и понимаю это, оборачиваясь назад и рассматривая устройство фреймворка laravel, но в данный момент на полное изучение автозагрузки нет времени, позже обязательно этого коснусь, тк действительно утомляет это постоянное прописывание require везде и всюду, от чего иногда возникают и некоторые глупые ошибки.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB