Como passar um array mais variáveis para uma função em PHP?
-
06-07-2019 - |
Pergunta
Eu tenho um protótipo de função como tal:
function do_upload( $file, $id, $type )
E estou chamando a função assim:
$this->do_upload( $files, $id, 'article' );
No entanto, apenas $files está sendo passado para a função.Tenho certeza que é simples, mas o que fiz de errado?
EDITAR:
Então $file é apenas uma matriz de informações de arquivo, semelhante a $_FILES e é passada corretamente, eu faço algumas manipulações adicionais na função.
$id é definido antes de eu chamar a função, se eu print_r() antes da chamada da função, vejo um ID que eu esperaria e $type é apenas uma string.
No entanto, se eu print_r() ou die() em $id ou $type ambos estiverem em branco e var_dump() retornará o seguinte:
die( var_dump( $id ) );
-> string(0) ""
die( var_dump( $type );
-> bool(false)
Logo antes da chamada da função: die( var_dump( $id) );
-> string(3) "111"
Alguma ideia?
SOLUÇÃO:
Caso alguém tenha um problema semelhante, verifique a resposta aceita abaixo.Essencialmente, eu precisava passar o array $files por referência, pois ele estava consumindo o espaço disponível na pilha.
Obrigado
Solução
Eu acho que você está realmente ficando sem espaço de pilha (ou qualquer espaço que o php use internamente para pilhas de chamadas) para a chamada de função.Tente passar $files por referência.Da mesma forma, tente passar apenas uma string para $files e veja se isso traz os outros parâmetros de volta.
Outras dicas
Para responder à pergunta "Como passar um array mais variáveis para uma função em PHP?"
function f($x,$y){}
f(array(),$a);
Mesmo que a estrutura seja semelhante a esta, ela funciona como deveria.
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');
}
}
O único exemplo que posso dar para reproduzir o erro em questão é este.Talvez alguém possa ser mais preciso?
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');
}
}
Eu sugiro que você dê uma outra olhada codeigniter
Na verdade, isso parece correto.O primeiro parâmetro é passado por referência, o que não é obrigatório no PHP 5 (todos os objetos e arrays agora são passados por referência por padrão), mas isso não deve quebrar nada.Eu recomendaria remover o &
de qualquer forma.
Acho que a questão precisa de mais contexto.Poste mais código ao redor para que as pessoas possam ajudá-lo a descobrir o que está acontecendo.
Um pouco recomendações* em relação ao seu código:
(1) use a notação camel case em vez de sublinhados para nomes de métodos: doUpload
Razões:
- legibilidade:distinguir funções nativas do php facilmente
- preguiça:escreva menos, não quebre os dedos por sublinhados
- percepção:Princípios da Gestalt, manter as coisas relacionadas juntas
(2) usar função pública/privada/protegida em vez de apenas função, restringir tanto quanto possível e abrir mais tarde, se necessário
Razão (de McConnell, Code Complete, 2ª Edição, p251):A diferença entre a filosofia da "conveniência" [muitas variantes globais] e a filosofia da "gerenciabilidade intelectual" [tão local quanto possível] se resume a uma diferença de ênfase entre escrever programas e lê-los.Maximizar o escopo pode de fato tornar os programas fáceis de escrever, mas um programa no qual qualquer rotina pode usar qualquer variável a qualquer momento é mais difícil de entender do que um programa que usa rotinas bem fatoradas.Num programa assim, você não consegue entender apenas uma rotina;você precisa entender todas as outras rotinas com as quais essa rotina compartilha dados globais.Esses programas são difíceis de ler, de depurar e de modificar.
Consequentemente, você deve declarar cada variável como visível para o menor segmento de código isso precisa ver.
(3) se você deseja declarar determinados parâmetros do método como opcionais, não defina o valor padrão com um tipo errado. $id
provavelmente será um número inteiro, então não configure-o como string com $id = ''
.Defina-o, por exemplo, 0 ou nulo.(legibilidade do código, sugestão de circunstâncias erradas)
* uma recomendação é uma informação cujo fornecedor da informação acredita que ajudará a melhorar a situação em questão
Que tal verificar is_array()?Tenho visto muitos códigos em que eles verificam a variável e, se não for um array, eles fazem algo como:
if (!is_array($files)) }
$f = $files;
$files = new array();
$files[] = $d
}
foreach( $files as $f ) {
// whatever...
}