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]   

> Описание: По-моему дело в области видимости переменных...
Devoll
Отправлено: 17 Октября, 2007 - 21:32:47
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Добрый вечер. Имеется такая функция:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //Функция инклюдинга
  4. function inc($file){
  5.         if(file_exists($file)){
  6.         nclude($file);
  7.         }else{
  8.                 die("<b>Include Error:</b> file ".$file." not found");
  9.         }
  10. }
  11.  
  12. inc('1.php');
  13. echo $temp;
  14. ?>
  15.  


и ее использование. И файл 1.php:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $temp = 'Вывести!';
  4. ?>
  5.  


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


 
 Top
evgenijj
Отправлено: 17 Октября, 2007 - 21:35:50
Post Id



Участник


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


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






Поскольку include вызывается из тела функции, то код из файла $file будет вставлен и выполнен внутри функции. Т.е. переменная $temp, оределенная в файле 1.php будет видна только внутри функции

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  //Функция инклюдинга
  4.  function inc($file){
  5.         if(file_exists($file)){
  6.           include($file);
  7.          echo $temp;
  8.         } else {
  9.           die("<b>Include Error:</b> file ".$file." not found");
  10.         }
  11.  }
  12.  inc('1.php');
  13.  echo $temp;
  14. ?>
  15.  


Результат
PHP:
скопировать код в буфер обмена
  1.  
  2. Вывести!
  3. Notice: Undefined variable: temp in D:/work/localhost/www/include.php on line 12
  4.  
 
 Top
Devoll
Отправлено: 17 Октября, 2007 - 21:47:21
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Ну это описка, конечно же include.
 
 Top
Devoll
Отправлено: 17 Октября, 2007 - 21:49:43
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Прикрепляю файлы
Скачать файл: test.rar
Скачан раз: 160
 
 Top
EuGen Администратор
Отправлено: 18 Октября, 2007 - 09:43:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Вы можете использовать для Вашего скрипта директиву global. Тогда не будет Notice и сработает изменение переменной. Я, однако, рекомендовал бы Вам возвращать значения изменяемых переменных. Вариант с global:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP  
  3.   //Функция инклюдинга  
  4.   function inc($file)
  5.   {  
  6.         global $temp;//одна или несколько переменных для изменения, либо массив
  7.         if(file_exists($file))  
  8.           include($file);  
  9.          else  
  10.           die("<b>Include Error:</b> file ".$file." not found");    
  11.   };
  12.   $temp=""; //инициализируем переменную - я лично, это рекомендую делать всегда.
  13.   inc('1.php');  
  14.   echo $temp;  
  15. ?>
  16.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Devoll
Отправлено: 18 Октября, 2007 - 13:15:09
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Вводить переменные в глобал хорошо когда переменных немного и знаешь названия переменных, а как быть когда таких переменных много и названия не знаешь? (эту функцию хотел использовать для подключения дополнительных скриптов)
 
 Top
EuGen Администратор
Отправлено: 18 Октября, 2007 - 13:19:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Хм.. если Вы не знаете названия переменных, как же Вы их в Вашем основном скрипте собираетесь использовать? То есть, допустим, даже если бы и сработало без global и Вам не нужно было бы его писать в функции, как бы Вы переменные с неизвестными именами стали использовать в скрипте после функции?
Имена можно сделать и
PHP:
скопировать код в буфер обмена
  1.  
  2. $edc0f615359c1d409f22a992cfababfb
  3.  

и

.. так что Вам в любом случае надо себе в этом случае четко представлять, что делается внутри подключаемого скрипта.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Devoll
Отправлено: 18 Октября, 2007 - 13:23:47
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Тогда буду ручками к каждому файлу делать проверку. Представьте когда таких переменных свыше 20 штук и эта цифра с каждым разом будет расширяться. Спасибо за ответ.
 
 Top
EuGen Администратор
Отправлено: 18 Октября, 2007 - 13:37:47
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




Существует, однако способ, сделать это по-другому (только для глобальных переменных, если у Вас в файлах будут какие-либо локальные переменные, они таким образом не учтутся):
PHP:
скопировать код в буфер обмена
  1.  
  2. //получение списка переменных включенного файла:
  3. include("1.php");
  4. $G_VARS=array_keys($GLOBALS);//тут будут ВСЕ переменные, включая те, что были до include
  5. foreach($G_VARS as $kvar)
  6. {
  7.    echo('переменная с именем $'.$kvar.' равна'. $GLOBALS[$kvar]."\\n");//ну или какие-нибудь другие действия
  8. };
  9.  

Если же Вам нужны переменные конкретного файла, то придется:
PHP:
скопировать код в буфер обмена
  1.  
  2. $G_VARS=array_keys($GLOBALS);
  3. include("1.php");
  4. $G_VARS_1=array_keys($GLOBALS);
  5. foreach($G_VARS as $kvar)
  6. {
  7.    if(!in_array($k_var, $G_VARS))//такой переменной раньше не было
  8.       echo('переменная с именем $'.$kvar.' равна'. $GLOBALS[$kvar]."\\n");//ну или какие-нибудь другие действия
  9. };
  10.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
valenok Модератор
Отправлено: 18 Октября, 2007 - 15:29:48
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




@ include('1.php');

1. Какого чёрта вы нас заставили качать свой файл.рар если всё что внутри вы уже давно написали.
2. А ведь даже если файла нет вы же пытаетесь вывести переменную $temp. Тоесть вы не проверяете её существование. Тогда первая строчка сообщения как раз для вас.\n\n(Добавление)
А вразумите в каком случаем может потребваться такая конструкция?
Вы так подобие динамических модулей пишете ?


-----
Truly yours, Sasha.
 
My status
 Top
EuGen Администратор
Отправлено: 18 Октября, 2007 - 15:33:17
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




valenok - тут есть тема, про то, что нужно скрипты из базы запускать - если честно, большего извращения в жизни не видел ((* ... так что всего скорее, это неправильное решение исходной задачи ((*


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Devoll
Отправлено: 18 Октября, 2007 - 18:43:15
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Повторюсь: то, что я вам написал, является скрипт, который должен будет подключать модули, написанные сторонним разработчиком.

Вобщем-то я сделал немного по-другому: забиваю название файлов, которые надо подключить в массив, а далее прогоняю этот массив и проверяю на существование файлов.
 
 Top
valenok Модератор
Отправлено: 18 Октября, 2007 - 20:07:40
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




читам папку readdir'om и каждый файл подключаем


-----
Truly yours, Sasha.
 
My status
 Top
Devoll
Отправлено: 18 Октября, 2007 - 22:33:51
Post Id



Новичок


Покинул форум
Сообщений всего: 59
Дата рег-ции: Июль 2007  


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




Я думал над этим, но удобнее в данной ситуации сделать как у меня ибо защищает от случайного подключения ненужных файлов, да и важна так же последовательность подключаемых файлов + некоторые файл подключать не требуется, ибо произойдет зацикливание (в одном файле реализуется подключение других файлов), но все это можно учесть, но на это уйдет много строчек кода.
 
 Top
valenok Модератор
Отправлено: 18 Октября, 2007 - 23:12:17
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


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




На это не должно уйти больше пяти минут правильной структуризации каталогов
и +2 лишних строки


-----
Truly yours, Sasha.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB