【问题标题】:How to pass an array plus variables to a function in PHP?如何将数组和变量传递给 PHP 中的函数?
【发布时间】:2009-11-28 22:29:40
【问题描述】:

我有一个这样的函数原型:

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

我这样调用函数:

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

但是,实际上只有 $files 被传递给函数。我确定这很简单,但我做错了什么?

编辑:

所以 $file 只是一个文件信息数组,类似于 $_FILES 并且可以很好地传递,我在函数中进一步对其进行了一些操作。

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

但是,如果我 print_r() 或 die() 在 $id 或 $type 上它们都是空白的,并且 var_dump() 返回以下内容:

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

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

有什么想法吗?

解决方案:

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

谢谢

【问题讨论】:

  • 你怎么知道它是唯一被通过的东西?在其中撒上一些var_dump() 语句,缩小问题发生的范围,然后找出问题所在。在那里你可以做得比我们在这里做得更好。
  • 您需要显示更多信息。到目前为止,我们只能猜测。我的第一个猜测是当你调用函数时变量只是空的。在您的代码中添加一些调试行(print_r($file), print_r($id) 等)并显示输出。
  • 数组$file通过fine发送。如果我在函数调用之前 print_r( $id ),我会得到我所期望的,而我发送的另一件事是一个字符串。但是,在函数中 $id 和 $type 都是空白的... ?!
  • 似乎所有答案都在这里被否决,所以我不会打扰。但我的猜测是你想用 $this->do_upload($this->files,$this->id,'article); 调用它
  • 这个问题缺少很多肯定有助于回答的信息。

标签: php codeigniter


【解决方案1】:

我认为您实际上用完了函数调用的堆栈空间(或 php 内部用于调用堆栈的任何空间)。尝试通过引用传递 $files。同样尝试将一个字符串传递给 $files 并查看是否会带回其他参数。

【讨论】:

  • 事实证明这绝对是问题所在,通过引用传递 $files 解决了它。
【解决方案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

【讨论】:

  • 我实际上并没有使用 CodeIngiter 的上传类,我自己编写了一个自定义控制器并将其放入所有需要上传功能的类都扩展的自定义控制器中。
【解决方案3】:

这实际上看起来是正确的。第一个参数是通过引用传递的,这在 PHP 5 中不是必需的(所有对象和数组现在默认通过引用传递),但这不会破坏任何东西。我还是建议删除&

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

【讨论】:

  • 我已经这样做了,数组 $file 仍然可以通过,但没有其他内容:/
  • 请发布您的代码。如果您向我们展示您的调用代码和功能,您可能会得到答案。
【解决方案4】:

关于您的代码的一些建议*

(1) 方法名使用驼峰式表示法而不是下划线:doUpload

原因:

  • 可读性:轻松区分原生 php 函数
  • 懒惰:少写,下划线不要伤手指
  • 感知:格式塔原则,将相关事物紧密联系在一起

(2) 使用public/private/protected 函数而不是函数,尽可能限制并在需要时开放

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

因此,您应该将每个变量声明为对需要查看它的最小代码段可见

(3) 如果要声明某些方法参数可选,不要将默认值设置为错误的类型。 $id 很可能是一个整数,所以不要用$id = '' 将它设置为字符串。将其设置为例如 0 或 null。 (代码可读性,错误情况提示)

* 推荐是信息提供者认为有助于改善相关情况的信息

【讨论】:

  • 这不是真的,您可以使用任何变量名称作为参数调用函数,这与函数本身的名称完全无关。
  • 当然,你是对的 jeroen,我似乎没有想太多 :)
  • 我敢说你没有读过太多关于 php 编码的最佳实践!
  • Zend Framework 和 Symfony 都这样做并推荐它!
  • 你认为还有谁设定了 OO PHP 的标准?
【解决方案5】:

检查 is_array() 怎么样?我已经看到很多代码在其中检查变量,如果它不是数组,他们会执行以下操作:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 2015-12-17
    • 2015-06-08
    • 2015-07-10
    • 1970-01-01
    • 2023-04-03
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多