[英]PHP include Problem
我正在尝试使用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{
我让它工作了,但这是一个不好的做法吗? 需要咨询
非常感谢
如前所述,您试图将代码包含在函数的中间,从而使包含页面的范围仅限于该函数。
一种解决方案是使文件包含全局数组,然后在脚本末尾包含它们。 只需将每个文件添加到数组,最后循环遍历并全部包含。
$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]);
}
注意:我没有测试任何代码,这纯粹是理论上的。 我不建议复制此文件,而是将其用作下车地点。
包含文件就像将文件内容恰好include
在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
,而无需使用该功能。
包含的作用域与该函数中的代码相同。
如果您希望在这种情况下将变量设置为全局变量,请将其分配给$GLOBALS['varName']
除了使用全局变量外,还可以使用静态类方法/属性,例如:
/* 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.