如何将数组和变量传递给PHP中的函数?

问题描述:

我有一个函数原型为这样:如何将数组和变量传递给PHP中的函数?

function do_upload($file, $id, $type) 

我打电话这样的功能:

$this->do_upload($files, $id, 'article'); 

然而,只有$文件实际上正在通过传递给函数。我确定这很简单,但是我做错了什么?

编辑:

所以$文件只是文件信息的阵列,类似于$ _FILES,它是经过精细过去了,我还做一些它的操纵功能。

$ id是在我调用函数之前设置的,如果我在函数调用之前调用print_r(),我会看到一个我期望的ID,$ type只是一个字符串。

但是,如果我的print_r(),或在任的$ id死亡()或$键入他们都是空白和的var_dump()返回如下:

die(var_dump($id)); - >string(0) ""
die(var_dump($type); - >bool(false)

在函数调用前右:die(var_dump($id)); - >string(3) "111"

任何想法?

SOLUTION:

如果有人有类似的问题,请检查下面接受的答案。基本上我需要通过引用传递$ files数组,因为它使用了可用的堆栈空间。

谢谢

+3

你怎么知道这是唯一被传递的东西?在那里添加一些'var_dump()'语句,缩小问题出现的位置,并将其解决。你可以在这里做得比我们在这里做得更好。 – gahooa 2009-11-28 22:31:55

+0

你需要显示更多信息。到目前为止,我们只能猜测。我的第一个猜测是,当你调用函数时,变量只是空的。将一些调试行添加到代码中('print_r($ file),print_r($ id)'等)并显示输出。 – 2009-11-28 22:34:24

+0

数组$文件通过罚款。 如果我print_r($ id)函数调用之前,我得到了我所期望的,而我发送的其他东西是一个字符串。 但是,在函数$ id和$ type中都是空白的......?! – 2009-11-28 23:33:17

我觉得你的实际运行出于对函数调用堆栈空间(或任何PHP空间内部使用的调用堆栈)。尝试通过引用传递$文件。同样尝试只传递一个字符串到$文件,看看是否带回其他参数。

+0

这原来是绝对的问题,通过引用传递$文件解决了它。 – 2009-11-29 11:32:04

如何检查is_array()?我已经看到了,他们检查的变量太多的代码,如果它不是一个数组他们做这样的事情:

if (!is_array($files)) } 
    $f = $files; 
    $files = new array(); 
    $files[] = $d 
} 

foreach($files as $f) { 
// whatever... 
} 

其实,这看起来是正确的。第一个参数是通过引用传递的,从PHP 5开始并不是必需的(所有对象和数组现在都通过默认引用传递),但是这不应该破坏任何内容。无论如何,我会建议删除&

我认为这个问题需要更多的上下文。请张贴更多周围的代码,以便人们可以帮助您弄清楚发生了什么。

+0

downvoter照顾留下评论? – Asaph 2009-11-28 22:52:25

+0

我已经这样做了,数组$文件仍然可以通过但没有别的:/ – 2009-11-28 23:34:17

+0

请只发布您的代码。如果您向我们显示您的通话代码和您的功能,您可能会得到您的答案。 – Asaph 2009-11-29 00:06:00

建议*涉及您的代码:

(1)使用,而骆驼符号比下划线方法名称:doUpload

原因:

  • 可读性:区分本地PHP轻松功能
  • 懒惰:少写点,不要突破你的手指下划线
  • 看法:完形的原则,保持相关的事情紧密结合起来

(2)使用公共/私营/保护功能,而不仅仅是功能,限制尽可能后来打通,如果需要的话

原因(来自McConnell,Code Complete,第2版,p251):“便利”哲学[许多全球变量]和“智力可管理性”哲学[尽可能地局部化]之间的区别归结为写作程序和阅读。使范围最大化确实可以使程序易于编写,但是任何程序在任何时候都可以使用任何变量的程序比使用良好分解程序的程序更难理解。在这样的程序中,你不能只理解一个例程;您必须了解该例程与全局数据共享的所有其他例程。这些程序很难阅读,很难调试,也很难修改。

通常,您应该声明每个变量对于需要查看它的最小代码段是可见的。 (3)如果要声明某些方法参数为可选,请不要将默认值设置为错误的类型。 $id很可能是一个整数,所以不要将它设置为与$id = ''串。将其设置为例如0或null。 (代码的可读性,错误的情况下,建议)

*的建议是,其中的信息提供者认为,这将有助于改善有关情况

+0

这不是真的,你可以用任何变量名称来调用一个函数,因为它的参数与函数内部的名字完全无关。 – jeroen 2009-11-28 22:58:03

+0

当然,你是对的jeroen,我似乎没有想太多:) – markus 2009-11-28 23:01:17

+0

我敢说,你没有阅读很多PHP编码的最佳实践! – markus 2009-11-28 23:18:12

要回答这个问题的信息“如何通过一个数组加上变量到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

+0

我实际上并没有使用CodeIngiter的上传类,我写了自己的代码,并将其放在需要上传功能的所有类的自定义控制器中。 – 2009-11-29 11:09:59