2010-09-03 8 views
0

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

$section = 'user'; 
    if(isset($_GET) && !empty($_GET) && $_GET !== ''){ 
     $module = $_GET['module'].".php"; 
     load_module($section, $module); 
    } 

функция load_module

function load_module($section="", $module=""){ 
    include(SITE_ROOT.DS.$section.DS.'modules'.DS.$module); 
} 

* Я уже определил DS как DIRECTORY_SEPARATOR

и я сохранил несколько файлов внутри папки модулей, файл загружается отлично, моя проблема в том, что вся переменная i, объявленная на моем включенном p возраст не загружается, вот мой код на одном из включаемого файла

if($session->is_logged_in()){ 
    $user = User::find_by_id($session->user_id); 
    $profile = $user->profile(); 
    $company = $user->compro(); 
    $logo = $user->logo(); 
}else{redirect_to('index.php');} 

на моем index.php я получил эту ошибку

Notice: Undefined variable: session in C:\www\starpro\user\modules\edit_company.php on line 3 Fatal error: Call to a member function is_logged_in() on a non-object in C:\www\starpro\user\modules\edit_company.php on line 3 

и если я переместить эти переменные внутри моего index.php, я получить это сообщение

Notice: Undefined variable: company in C:\www\starpro\user\modules\edit_company.php on line 181 Notice: Trying to get property of non-object in C:\www\starpro\user\modules\edit_company.php on line 181 

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

с уважением

====================================================================================================================================== ========================

я использую ответ

deceze и изменить класс моего пользователя, добавляя статическую функцию как этот

public static function load_module($section="", $module="", $user_id=""){ 
$user = self::find_by_id($user_id); 
    $profile = $user->profile(); 
    $company = $user->compro(); 
    $logo = $user->logo(); 
include(SITE_ROOT.DS.$section.DS.'modules'.DS.$module); 
} 

, а затем на мой индекс я использую этот

if(isset($_GET) && !empty($_GET) && $_GET !== ''){ 
    $module = $_GET['module'].".php"; 
    User::load_module($section, $module, $user->id); 
}else{ 

я получил это работает, но я s это плохая практика ?? нужно посоветовать

спасибо много

ответ

3

Как было указано, вы пытаетесь включить код в середину функции, делая область включенной страницы ограниченной этой функцией.

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

$includeFiles = array(); 

... 

function load_module($section="", $module=""){ 
    // include(SITE_ROOT.DS.$section.DS.'modules'.DS.$module); 
    global $includeFiles; 
    $location = SITE_ROOT.DS.$section.DS.'modules'.DS.$module; 
    array_push($includeFiles, $location); 
} 

... 

foreach($inludeFiles as $location) 
{ 
    include_once($location); 
    // using include_once so that if the file is added multiple times in the 
    // document, it only gets included once 
} 

Это также серьезная угроза безопасности для включения файла на основе параметра в запросе GET. Вы должны дезинформировать этот ввод путем удаления или кодирования всех символов, которые могут быть использованы для перехода в другой каталог, и включить код, который вы не хотите включать (так что удалите любые косые черты и т. Д.), Или сделайте белый список включенных файлов. Если у вас массив разделов и модулей и их расположения вы могли бы принять подход, который позволит решить обе проблемы:

$modules = array(
    'section1' => array(
        'module1' => '/php/modules/module1.php', 
        'module2' => '/php/frameworks/foo/bar.php' 
        ), 
    'section2' => array(
        'module1' => '/php/modules/baz.php', 
        'module2' => '/php/modules/quot.php' 
        ) 
    ) 
} 

$modulesIncluded = array(); 

... 

function load_module($section="", $module="") 
    global $modulesIncluded; 
    array_push($modulesIncluded, $section => $module); 
} 

... 

foreach($modulesIncludes as $section => $module) 
{ 
    include_once($modules[$section][$module]); 
} 

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

+0

Я рассмотрю это как хорошую ссылку, спасибо за ценную информацию – littlechad

0

Включая файл как положить содержимое файла точно, где команда include есть. Итак, это:

function load_module($section="", $module=""){ 
    include(SITE_ROOT.DS.$section.DS.'modules'.DS.$module); 
} 

эквивалентно следующему:

function load_module($section="", $module=""){ 
    if($session->is_logged_in()){ 
     $user = User::find_by_id($session->user_id); 
     $profile = $user->profile(); 
     $company = $user->compro(); 
     $logo = $user->logo(); 
    }else{redirect_to('index.php');} 
} 

Все ваши переменные приурочены к области видимости функции. Как только функция возвращается, переменные выходят за рамки. Кроме того, переменные, которые не входят в объем внутри функции, недоступны для включенного кода.

Вам нужно будет сделать include непосредственно без функции.

+0

я собираюсь попробуйте это Большое спасибо – littlechad

+0

Я получил это, сделав небольшое изменение в функции, вместо того, чтобы поместить функцию load_module, я перемещаю ее внутри пользовательского класса опубликовал изменение на мой вопрос, сообщите спасибо – littlechad

0

Область включения такая же, как если бы код был в этой функции.

Если вы хотите переменную в этом случае быть глобальным, присвоить его $GLOBALS['varName']

0

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

/* session.php */ 
class session { 
    public static $user_id; 
    public static $logged_in; 
    public static function user_id() { 
     return self::$user_id; 
    } 
    public static is_logged_in() { 
     return self::$logged_in; 
    } 
} 

/* foo.php */ 
class foo { 
    public static $user; 
    public static $profile; 
    public static $company; 
    public static $logo; 
    public static function init() { 
     self::$user = User::find_by_id(Session::user_id()); 
     self::$profile = self::$user->profile();   
     self::$company = self::$user->compro(); 
     self::$logo = self::$user->logo(); 
    } 
} 

if (Session::is_logged_in()) { 
    foo:init(); 
} 
Смежные вопросы