Перейти к содержимому


Партнерская программа Kredov

Область видимости переменной

#1 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 04 Декабрь 2009 - 11:40

есть файл config.php
<?php
$error = "ошибка 404. Такой страницы не сущеструет.";
$null = "в данном разделе информация не обнаружена.";
?>


есть файл functions.php
<?php
// функция загрузки контента
function LoadContent()
{
// получаем данные из адресной строки
$module = trim($_GET['module']);

// защищаем полученные данные от возможных атак
if(!preg_match("/^[a-z0-9]+$/i",$module))
{
$module = '';
}

// если полученные данные пустые задаем отображение главной страницы
if ($module == '')
{
$module = "news";
}

// выбираем модуль
$sql = "SELECT `module` FROM `module` WHERE module='$module'";
$mod = mysql_query("$sql");
if (mysql_num_rows($mod) == 0)
{
echo $null;
}
else
{
$query_mod = mysql_fetch_assoc($mod);
$file = "module/".trim($query_mod['module']).".php";

// если полученный модуль существует, подключаем его
if (is_readable($file)) {
include($file);
} else {
echo $error;
}
}
};

?>


есть файл index.php
<?php
require_once('include/config.php');
require_once('include/functions.php');
LoadContent();
?>


и есть файле article.php
<?php

// получаем идентификатор статьи
$id = intval($_GET['id']);

// если идентификатор не задан, задаем начальный
if (!isset($_GET['id']))
{
$id = 1;
};

// выбираем статью
$sql = "SELECT * FROM `article` WHERE id='$id' AND published=1";
$mod = mysql_query("$sql");
if (mysql_num_rows($mod) == 0)
{
echo $error;
}
else
{
// публикуем статью
$query_mod = mysql_fetch_assoc($mod);
echo $query_mod['title'].$query_mod['article'];

}
?>


как сделать, чтоб переменные $error и $null были видны в функции LoadContent() и отображались при выполнении файла article.php?

 

 

  • 0

#2 EugeneM

EugeneM
  • Пользователь
  • 20 сообщений
  • Репутация: 0

Отправлено 05 Декабрь 2009 - 04:45

Использовать инструкцию global. Она позволяет работаеть внутри функции с глобальными переменными.
Например, будет так:

function LoadContent()
{
global $error, $null;

// а дальше непосредственно текст самой функции, как у Вас там написано...
}


и отображались при выполнении файла article.php?

Если файл article.php будет подключаться как
require_once('include/article.php');

то их будет там и так видно (но внутри своих функций, опять же, нужна будет global).
  • 0

#3 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 06 Декабрь 2009 - 00:23

sc2r2bey, как уже сказал EugeneM переменные будут видны в функции используя оператор расширения видимости переменных (пример выше), а так же можно писать так:
...
echo $GLOBALS['error'];
...
echo $GLOBALS['null'];
...

Тут главное понимать что конструкции include, include_once дают команду интерпретатору остановиться на данном включении и проанализировать включаемый файл. Затем включить его в проект заменяя конструкцию вставки содержимым включаемого файла(конечно это образно, для понимания).

PHP преобразует сценарий во внутреннее представление, анализируя строки сценария по очереди, пока не доходит до конструкции include. Дойдя до include, PHP прекращает транслировать сценарий и переключается на указанный в include файл. Таким образом из-за подобного поведения транслятора, быстродействие сценария снижается, особенно при большом колличестве включаемых с помощью include файлов. С require таких проблем нет, поскольку файлы с помощью require включаются до выполнения сценария, то есть на момент трансляции файл уже включен в сценарий.

Таким образом, целесообразнее использовать конструкцию require там, где не требуется динамическое включение файлов в сценарий, а конструкцию include использовать только с целью динамического включения файлов в код PHP скрипта.


В твоём примере не видно как файл article.php связан со всеми остальными.
  • 0


Оформление форума – IPBSkins.ru