PHP включает проблему - PullRequest
       2

PHP включает проблему

0 голосов
/ 03 сентября 2010

Я пытаюсь применить какую-то модульную систему в моей сети, используя get и include, вот мой код на моем index.php

    $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

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

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

пожалуйста, помогите мне, заранее спасибо

Привет

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

Я использую ответ Дечезе

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

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{

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

большое спасибо

Ответы [ 4 ]

3 голосов
/ 03 сентября 2010

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

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

$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 голосов
/ 03 сентября 2010

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

/* 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();
}
0 голосов
/ 03 сентября 2010

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

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

0 голосов
/ 03 сентября 2010

Включение файла похоже на размещение содержимого файла именно там, где находится команда 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 напрямую без функции.

...