我正在尝试在我的网络上应用一些模块系统,使用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
并且我在modules文件夹中存储了一些文件,文件加载完美,我的问题是我在包含的页面上声明的所有变量都无法加载,这是我在其中一个包含文件上的代码
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{
我得到了它的工作,但这是一个不好的做法? 需要建议
非常感谢
答案 0 :(得分: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]);
}
注意:我没有测试过任何代码,这纯粹是理论上的。我不建议复制这个,而是将它作为起点。
答案 1 :(得分: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
。
答案 2 :(得分:0)
include的范围与代码在该函数中的范围相同。
如果您希望此案例中的变量为全局变量,请将其分配给$GLOBALS['varName']
答案 3 :(得分: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();
}