简历:
我(php初学者)遇到一个问题,即global variable
未在特定包含gator::display("main_filelist.php", $params)
中定义,似乎是一个函数。其他人包括同样没有这个问题。的 // 的
我在我的网站上使用名为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
是全局的并且位于文件的顶部,因此本页面中的其他所有内容都应该考虑它,并且它对每个包含的内容都会被考虑。
FileGator并没有以经典的方式包含他的文件,因为导致我麻烦的包含有这样的形状:<?php gator::display("main_filelist.php", $params)?>
经过一番挖掘,找出这个乱码的意思(注意FileGator不再提供高级支持,并且FAQ的资源在我的问题中有限)这里有我可以收集的信息解决这个问题:
gator::display()
看起来是一个名为file-gator.php的文件中定义的函数,该文件也是生成我的main.php
文件的页面(例如,如果我没有登录它可以显示而不是login.php)。
以下是我在gator::display()
中找到的关于file-gator.php
的内容:
<?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.filep中包含的main_filelist.php文件是通过require_once函数包含的(gatorconf::get('base_path')
只是文件管理器的安装路径)exept这个require_once function
显然是在里面功能public static function display
,其变量$param
位于require_once ...
我很肯定这就是为什么我的变量不能用于此函数所包含的代码的原因。
如果我按gator::display("main_filelist.php", $params)
重新gator::display("main_filelist.php")
,大部分代码都无法运作。
但是,如果我将gator::display("main_filelist.php", $params)
替换为经典包含include('main_filelist.php')
,那么大部分代码都会被执行,我实际上可以看到我的变量$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;
}
?>
答案 0 :(得分:1)
阅读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') );
应该说明你的问题。