简历:
我(php初学者)遇到了一个问题,在似乎是函数的特定include gator::display("main_filelist.php", $params)
中没有定义global variable
。其他包括在同一个没有这个问题//
我在我的网站上使用一个名为FileGator的文件管理器。
在这个文件管理器中,有一个名为main.php
的文件,它是每个用户在浏览文件夹或上传/下载/操作文件时所处的页面。
现在这个main.php
文件包括其他几个php文件(用于配置、模板、表…)。同样在这个main.php
文件中,在文件的一开始,我有一个函数,它定义了一个全局变量$getprivileges。
main.php
:的一部分
<!-- Determine User's permissions on current directory -->
<?php
$directory = $_SESSION['cwd']; // current directory
$user = $_SESSION['simple_auth']['username']; // get username
$repository = gatorconf::get('repository'); // get base repertory of the file manager
$userdir = $repository.DS.'user'.DS.$user; // user's repertory
$getprivileges = scanDirectory($userdir, $directory);
function scanDirectory($userdir = '', $directory){
$folders = glob($userdir . '/*' , GLOB_ONLYDIR);
foreach($folders as $folder){
if (($folder == $directory && gator::checkPermissions('r')) || (gator::checkPermissions('ru')) || ($userdir == $directory && gator::checkPermissions('r'))) {
return true;
}
$scan_result = scanDirectory($folder, $directory);
if($scan_result) {
return true;
}
}
return false;
}
scanDirectory($userdir, $directory);
if ((gator::checkPermissions('ru')) || ($userdir == $directory && gator::checkPermissions('r'))) {
$getprivileges = true;
}
?>
...code
...more code
<?php gator::display("main_filelist.php", $params)?>
...code again
由于我的变量$getprivileges
是全局的,并且位于文件的顶部,因此本页中的每个其他include都应该考虑它,并且它对每个includes-exept都会考虑它。
FileGator没有以经典的方式包含他的文件,因为给我带来麻烦的包含是这样的:<?php gator::display("main_filelist.php", $params)?>
经过一些挖掘,找出了这个胡言乱语的含义(请注意,FileGator不再提供高级支持,常见问题解答的资源在我的问题中是有限的)以下是我可以收集的信息,以尝试解决这个问题:
gator::display()
看起来是一个在名为file-gator.php的文件中定义的函数,该文件也是生成main.php
文件的页面(例如,如果我没有登录,它可以显示login.php)。以下是我在这个file-gator.php
:中可以找到的关于gator::display()
的内容
<?php>
class gator {
public static function display($view, $params = null){
require_once gatorconf::get('base_path')."/include/views/".$view;
}
}
<?>
这里是main_filelist.php
的一部分,所以你可以看到$params的用途:
<table class="file-list">
<?php $i = 1;?>
<tbody>
<?php if(!empty($params['dirs'])) foreach ($params['dirs'] as $file):?>
<?php if (($file['name'] == "user") && ($_SESSION['cwd'] == gatorconf::get('repository'))):?>
<?php else:?>
<tr class="directory <?php if ($file['type'] == "back") echo 'back-button';?>">
<?php if ($getprivileges == true): ?>
<?php if ($file['type'] != 'back' && $file['type'] != 'user'):?>
<td class="chkboxes"><input type="checkbox" name="<?php echo $i++;?>" value="<?php echo $file['crypt']?>" /></td>
<?php elseif ($file['type'] == 'user'):?>
<td class="chkboxes"><a class="user" href="?cd=<?php echo $file['link']?>"></a></td>
<?php else:?>
<td class="chkboxes"><a class="back" href="?cd=<?php echo $file['link']?>"></a></td>
<?php endif;?>
<?php else:?>
<?php if ($file['type'] != 'back' && $file['type'] != 'user'):?>
<td class="chkboxes"><a class="folder" href="?cd=<?php echo $file['link']?>"></a></td>
<?php elseif ($file['type'] == 'user'):?>
<td class="chkboxes"><a class="user" href="?cd=<?php echo $file['link']?>"></a></td>
<?php else:?>
<td class="chkboxes"><a class="back" href="?cd=<?php echo $file['link']?>"></a></td>
<?php endif;?>
<?php endif;?>
因此,我的main.php上包含的文件main_filelist.php似乎是通过require_once函数包含的(gatorconf::get('base_path')
只是文件管理器的安装路径),但这个require_once function
显然在函数public static function display
中,在require_once的顶部有一个变量$param
。。。
我确信这就是为什么我的变量不适用于此函数所包含的代码的原因。
如果我用gator::display("main_filelist.php")
替换gator::display("main_filelist.php", $params)
,那么大部分代码都无法工作。
但是,如果我用经典的include include('main_filelist.php')
替换gator::display("main_filelist.php", $params)
,那么大部分代码都会被执行,我实际上可以看到我的变量$getprivileges
被考虑在内。
- 为什么我的变量
$getprivileges
不适用于这种类型的包括(调试报告我没有为定义变量gator::display("main_filelist.php", $params)
包含的代码) - 如何在不改变变量工作方式的情况下使其工作包含在
$params
中?(我害怕破坏密码我可能不得不为中的另一个文件执行此操作我可能别无选择的未来)
很抱歉这篇文章太长了,我试图提供尽可能多的信息,事实上,我通过重述这种情况弄清楚了很多。
此外,我是php的初学者,所以如果你有一些建议,请随时提供你想要的详细信息:s非常感谢你的帮助!
-apatik
更新:
我在main-filelist.php
上添加了这段代码(包含的文件不会得到我的$getprivilege
,到目前为止它看起来还可以!将测试所有可能性。
<?php
$directory = $_SESSION['cwd'];
$user = $_SESSION['simple_auth']['username'];
$repository = gatorconf::get('repository');
$userdir = $repository.DS.'user'.DS.$user;
$getprivileges = scanDirectory($userdir, $directory);
if ((gator::checkPermissions('rw')) || ($userdir == $directory && gator::checkPermissions('r'))) {
$getprivileges = true;
}
?>
阅读http://docs.php.net/language.variables.scope和http://docs.php.net/get_defined_vars然后的输出
<?php // test2.php
var_export( get_defined_vars() );
和
<?php
$globalvar = 1;
require 'test2.php';
class Foo {
public static function bar($params) {
$localvar = 2;
require 'test2.php';
}
}
echo "'r'n--------------------'r'n";
$foo = new Foo;
$foo->bar( array('getprivileges'=>'something') );
应该说明你的问题。