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

Foi útil?

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...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top