Как передать массив плюс переменные в функцию в PHP? - PullRequest
1 голос
/ 29 ноября 2009

У меня есть прототип функции как таковой:

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

И я вызываю функцию так:

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

Однако, только $ files фактически передается функции. Я уверен, что это просто, но что я сделал не так?

РЕДАКТИРОВАТЬ:

Так что $ file - это просто массив информации о файле, похожий на $ _FILES, и он проходит через нормально, я делаю некоторые манипуляции с ним далее в функции.

$ id устанавливается до того, как я вызываю функцию, если я print_r () перед вызовом функции, я вижу ожидаемый идентификатор, а $ 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 по ссылке, так как он занимал доступное пространство стека.

Спасибо

Ответы [ 5 ]

2 голосов
/ 29 ноября 2009

Я думаю, что вы фактически исчерпали пространство стека (или любое пространство, которое php использует внутренне для стеков вызовов) для вызова функции. Попробуйте передать $ файлы по ссылке. Точно так же попробуйте передать только строку в $ files и посмотреть, возвращает ли это другие параметры.

2 голосов
/ 29 ноября 2009

Чтобы ответить на вопрос «Как передать массив плюс переменные в функцию в 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 голос
/ 29 ноября 2009

Это на самом деле выглядит правильно. Первый параметр передается по ссылке, которая не требуется в PHP 5 (все объекты и массивы теперь передаются по ссылке по умолчанию), но это ничего не должно сломать Я бы порекомендовал удалить & в любом случае.

Я думаю, что вопрос нуждается в большем количестве контекста. Пожалуйста, опубликуйте больше окружающего кода, чтобы люди могли помочь вам понять, что происходит.

1 голос
/ 29 ноября 2009

Несколько рекомендаций * относительно вашего кода:

(1) используйте скорее имена верблюдов, чем подчеркивания для имен методов: doUpload

Причины:

  • удобочитаемость: легко различать нативные функции php
  • лень: пиши меньше, не ломай пальцы для подчеркивания
  • восприятие: гештальт-принципы, держите взаимосвязанные вещи вместе

(2) использовать общедоступную / приватную / защищенную функцию вместо просто функции, максимально ограничить ее и открыть позже, если необходимо

Причина (из McConnell, Code Complete, 2nd Edition, p251): Разница между философией «удобства» [множество глобальных изменений] и философией «интеллектуальной управляемости» [настолько локальной, насколько это возможно] сводится к разнице акцент между написанием программ и их чтением. Максимизация области действия может действительно облегчить написание программ, но программу, в которой любая подпрограмма может использовать любую переменную в любое время, труднее понять, чем программу, которая использует хорошо продуманные подпрограммы. В такой программе вы не можете понять только одну процедуру; Вы должны понимать все другие подпрограммы, с которыми эта подпрограмма разделяет глобальные данные. Такие программы трудно читать, отлаживать и изменять.

Следовательно, вы должны объявить каждую переменную видимой для наименьшего сегмента кода , который должен ее видеть.

(3) если вы хотите объявить определенные параметры метода необязательными, не устанавливайте значение по умолчанию с неправильным типом. $id скорее всего будет целым числом, поэтому не устанавливайте его в строку с $id = ''. Установите это например 0 или нуль. (удобочитаемость кода, предположение о неправильных обстоятельствах)

* рекомендация - это информация, о которой поставщик информации полагает, что она поможет улучшить ситуацию, о которой идет речь

0 голосов
/ 29 ноября 2009

Как насчет проверки is_array ()? Я видел много кода, в котором они проверяют переменную, и если это не массив, они делают что-то вроде:

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

foreach( $files as $f ) {
 // whatever...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...