2009-11-28 7 views
1

J'ai un prototype de fonction en tant que tel:Comment passer un tableau plus des variables à une fonction en PHP?

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

Et j'appelle la fonction comme ceci:

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

Cependant, seuls les fichiers $ est en fait d'être passés par la fonction. Je suis sûr que c'est simple mais qu'ai-je fait de mal?

EDIT:

Donc $ fichier est juste un tableau d'informations de fichier, similaire à _FILES $ et il est passé à travers bien, je fais une certaine manipulation de celui-ci plus loin dans la fonction. $ Id est défini avant que j'appelle la fonction, si je print_r() avant l'appel de fonction, je vois un ID que je m'attendais et $ type est juste une chaîne.

Cependant, si je print_r() ou mourir() soit sur $ id ou tapez $, ils sont à la fois blanc et var_dump() renvoie les éléments suivants:

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

Juste avant l'appel de fonction: die(var_dump($id)); ->string(3) "111"

Toutes les idées?

SOLUTION:

Dans le cas où quelqu'un a un problème similaire, cochez la réponse acceptée ci-dessous. Essentiellement, je devais passer le tableau $ files par référence car il utilisait l'espace de pile disponible.

Merci

+3

Comment savez-vous que c'est la seule chose qui se passe? Saupoudrez quelques instructions 'var_dump()' là-dedans, en réduisant l'endroit où le problème se produit, et découvrez-le.Vous pouvez le faire mieux que nous pouvons ici. – gahooa

+0

Vous devez montrer plus d'informations. Jusqu'à présent, nous ne pouvons que deviner. Ma première supposition est que les variables sont juste vides lorsque vous appelez la fonction. Ajoutez des lignes de débogage à votre code ('print_r ($ fichier), print_r ($ id)', etc) et montrez la sortie. –

+0

Le tableau $ file est envoyé à travers. Si j'imprime print_r ($ id) avant l'appel de la fonction, j'obtiens ce que j'attendrais et l'autre chose que j'ai envoyée est une chaîne. Cependant, dans la fonction $ id et $ type sont tous les deux vides ...?! –

Répondre

2

Je pense que votre course fait hors de l'espace de pile (ou tout autre espace php utilise en interne pour les piles d'appel) pour l'appel de fonction. Essayez de transmettre des fichiers $ par référence. Également, essayez de passer juste une chaîne à $ files et voyez si cela ramène les autres paramètres.

+0

Cela s'est avéré être absolument le problème et en passant $ files par référence résolu. –

0

Comment vérifier is_array()? J'ai vu beaucoup de code dans lequel ils vérifient pour la variable, et si ce n'est pas un tableau qu'ils font quelque chose comme:

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

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

Cela semble réellement correct. Le premier paramètre est passé par référence qui n'est pas requis depuis PHP 5 (tous les objets et tableaux sont maintenant passés par référence par défaut), mais cela ne devrait rien casser. Je recommande de retirer le & de toute façon.

Je pense que la question a besoin de plus de contexte. Veuillez poster plus de code environnant afin que les gens puissent vous aider à comprendre ce qui se passe.

+0

Est-ce que le downvoter voudrait laisser un commentaire? – Asaph

+0

Je l'ai fait, et le tableau $ file passe toujours bien, mais rien d'autre n'est:/ –

+0

S'il vous plaît juste poster votre code. Si vous nous montrez votre code d'appel et votre fonction, vous obtiendrez probablement votre réponse. – Asaph

1

Quelques recommandations * concernant votre code:

(1) utiliser la notation de cas plutôt de chameau que underscores pour les noms de méthode: doUpload

Raisons:

    lisibilité
  • : distinguer php native fonctionne facilement
  • lazyness: écrivez moins, ne vous cassez pas les doigts pour les underscores
  • perception: principes de la Gestalt, garder les choses liées étroitement

(2) usage public/fonction privée/protégée au lieu de simplement la fonction, limiter autant que possible et d'ouvrir plus tard, si nécessaire

Raison (De McConnell, Code Complete, 2e édition, p. 251): La différence entre la philosophie de «commodité» [beaucoup de vars globaux] et la philosophie de «gestion de la faculté intellectuelle» [aussi locale que possible] se résume à une différence d'accentuation entre l'écriture programmes et les lire. Maximiser la portée peut en effet rendre les programmes faciles à écrire, mais un programme dans lequel n'importe quelle routine peut utiliser n'importe quelle variable à n'importe quel moment est plus difficile à comprendre qu'un programme qui utilise des routines bien factorisées. Dans un tel programme, vous ne pouvez pas comprendre une seule routine; vous devez comprendre toutes les autres routines avec lesquelles cette routine partage des données globales. De tels programmes sont difficiles à lire, difficiles à déboguer et difficiles à modifier.

Par conséquent, vous devez déclarer chaque variable pour être visible au plus petit segment de code qui doit le voir. (3) si vous souhaitez déclarer certains paramètres de méthode facultatifs, ne définissez pas la valeur par défaut avec un type incorrect. $id sera très probablement un nombre entier, donc ne le définissez pas en chaîne avec $id = ''. Définissez-le par exemple 0 ou null. (Lisibilité du code, suggestion de mauvaises circonstances)

* une recommandation est une information dont le fournisseur de l'information estime qu'il contribuera à améliorer la situation en question

+0

Ce n'est pas vrai, vous pouvez appeler une fonction avec n'importe quel nom de variable en tant qu'arguments, ce qui n'a aucun rapport avec le nom à l'intérieur de la fonction elle-même. – jeroen

+0

bien sûr, vous avez raison jeroen, je ne pensais pas beaucoup il semble :) – markus

+0

Je pense que vous n'avez pas lu beaucoup de meilleures pratiques en codage php! – markus

2

Pour répondre à la question: « Comment passer un tableau plus des variables à une fonction en PHP? "

function f($x,$y){} 
f(array(),$a); 

Même si la structure est similaire à cela, cela fonctionne comme prévu.

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'); 
    } 
} 

Le seul exemple que je peux donner pour reproduire l'erreur en question est la suivante. Peut-être que quelqu'un peut être plus précis?

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'); 
    } 
} 

Je vous suggère de jeter un autre regard sur codeigniter

+0

Je n'utilise pas réellement la classe de téléchargement de CodeIngiter, j'ai écrit la mienne et je l'ai mise dans un contrôleur personnalisé que toutes les classes nécessitant la fonctionnalité de téléchargement s'étendent. –

Questions connexes