我有一个函数原型:
function do_upload( $file, $id, $type )
我正在调用这样的函数:
$this->do_upload( $files, $id, 'article' );
但是,实际上只有$ files传递给该函数。我确定这很简单,但我做错了什么?
编辑:
所以$ file只是一个文件信息数组,类似于$ _FILES,它传递得很好,我在函数中对它进行了一些操作。
$ id在我调用函数之前设置,如果在函数调用之前我是print_r()我看到了我期望的ID而$ type只是一个字符串。
但是,如果我在$ id或$ type上使用print_r()或die(),则它们都是空白的,var_dump()将返回以下内容:
die( var_dump( $id ) );
- > string(0) ""
die( var_dump( $type );
- > bool(false)
在函数调用之前:die( var_dump( $id) );
- > string(3) "111"
有什么想法吗?
解决方案:
如果有人遇到类似问题,请查看下面接受的答案。基本上我需要通过引用传递$ files数组,因为它耗尽了可用的堆栈空间。
由于
答案 0 :(得分:2)
回答问题“如何将数组加变量传递给PHP中的函数?”
function f($x,$y){}
f(array(),$a);
即使结构与此类似,它也可以正常工作。
class a {
function do_upload( &$file, $id, $type) {
}
}
class b extends a {
public function f() {
$files = array('a','b');
$id = "string";
$this->do_upload($files,$id,'article');
}
}
我可以给出重现错误的唯一例子就是这个。也许某人可以更准确?
class b extends a {
function do_upload( &$file, $id, $type) {
parent::do_upload($file, '', false);
}
public function f() {
$files = array('a','b');
$id = "string";
$this->do_upload($files,$id,'article');
}
}
我建议您再看看codeigniter
答案 1 :(得分:2)
我认为你的函数调用实际上耗尽了堆栈空间(或者内部用于调用堆栈的任何空间)。尝试通过引用传递$ files。同样尝试只将一个字符串传递给$ files,看看是否会带来其他参数。
答案 2 :(得分:1)
这实际上看起来是正确的。第一个参数是通过引用传递的,从PHP 5开始不需要(现在默认情况下所有对象和数组都通过引用传递),但这不应该破坏任何东西。无论如何,我建议删除&
。
我认为这个问题需要更多背景。请发布更多周围的代码,以便人们可以帮助您弄清楚发生了什么。
答案 3 :(得分:1)
关于您的代码的一些建议* :
(1)使用相当于驼峰的表示法而不是下划线的方法名称:doUpload
原因:
(2)使用public / private / protected功能而不仅仅是功能,尽可能限制并在以后打开,如果需要的话
理由(来自McConnell,Code Complete,第2版,第251页):“便利”哲学[很多全球变量]和“智力可管理性”哲学[尽可能地在本地]之间的差异可归结为差异强调编写程序和阅读它们。最大化范围可能确实使程序易于编写,但任何例程可以随时使用任何变量的程序比使用良好因素例程的程序更难理解。在这样的程序中,你不能只理解一个例程;您必须了解该例程与其共享全局数据的所有其他例程。这些程序难以阅读,难以调试,难以修改。
通常,您应该声明每个变量对于需要查看的最小代码段是可见的。
(3)如果要声明某些方法参数是可选的,请不要使用错误的类型设置默认值。 $id
很可能是一个整数,因此不要将其设置为$id = ''
字符串。将其设置为示例0或null。 (代码可读性,错误情况的建议)
*建议是信息提供者认为有助于改善有关情况的信息
答案 4 :(得分:0)
检查is_array()怎么样?我看过很多代码,他们检查变量,如果它不是数组,他们会做类似的事情:
if (!is_array($files)) }
$f = $files;
$files = new array();
$files[] = $d
}
foreach( $files as $f ) {
// whatever...
}