2010-11-19 1 views
4
$name = $_POST["name"]; 
$url = $_POST["url"]; 
$active = $_POST["active"]; 

if($action == "add") 
{ 
    var_dump($name); // Returns: String(10) "..." 
    var_dump($url); // Returns: String(27) "..." 
    var_dump($active); // Returns: String(2) "..." 

    addSponsor(); // Returns: NULL NULL NULL 
} 

function addSponsor() 
{ 
    var_dump($name); 
    var_dump($url); 
    var_dump($active); 
} 

Je pense que le quanundrum est auto-implicite, mais même si je vais formuler ce problème au mieux de mes capacités.Var vidage appelé à partir d'une fonction donne des résultats absurdes

WTH?

Les variables sont initialisés au début du script, mais la moitié de mes var_dumps retour NULL

Pourquoi?

+2

Portée! Portée! Portée! – Stephen

Répondre

1

Vous tentez d'accéder à des variables hors de portée. $ name, $ url et $ active sont déclarés en dehors de la fonction addSponsor; Ainsi, la fonction pense que vous créez de nouvelles variables et les initialise à null.

+0

UGH, je n'oublie pas que PHP a sa portée de haut en bas ... – Hubro

1

La fonction addSponsor() appelle var_dump sur ce qu'elle voit comme NULL car les variables auxquelles vous essayez d'accéder se trouvent dans la portée globale. this page explique assez bien.

2

Pour accéder à ces variables à l'intérieur de la fonction (sans les transmettre comme arguments), vous aurez besoin d'utiliser le mot-clé global dire PHP qu'ils ont été déclarés dans la portée globale:

function addSponsor() 
{ 
    global $name, $url, $active; 
    var_dump($name); 
    var_dump($url); 
    var_dump($active); 
} 

Je voudrais suggèrent spécifier des paramètres formels, et en faisant passer les variables comme arguments à la fonction:

function addSponsor($name, $url, $active) 
{ 
    var_dump($name); 
    var_dump($url); 
    var_dump($active); 
} 

Voir http://php.net/manual/en/language.variables.scope.php

2

Si vous devez, vous pouvez le faire:

function addSponsor() { 
    global $name, $url, $active; 

    var_dump($name); 
    var_dump($url); 
    var_dump($active); 
} 

Mais les variables globales sont mauvaise forme. Je réécrire votre script comme ceci:

$post_vars = array(
    'name' => $_POST["name"], 
    'url' => $_POST["url"], 
    'active' => $_POST["active"] 
); 

if ($action === "add") { 
    foreach ($post_vars as $post_var) { 
     var_dump($post_var); 
    } 
    addSponsor($post_vars); 
} 

function addSponsor($post_vars = array()) { 
    foreach ($post_vars as $post_var) { 
     var_dump($post_var); 
    } 
} 
+0

Moi, '$ name',' $ url', et '$ active' seraient des paramètres de la fonction. – strager

+0

@strager, également valide. – Stephen

1

Si vous souhaitez utiliser ces vars dans votre fonction, vous devez les déclarer mondiale:

function addSponsor() 
{ 
    global $name, $url, $active; 
    var_dump($name); 
    var_dump($url); 
    var_dump($active); 
} 
-1

Pour rendre les choses plus faciles à lire, je très conseiller le codage d'une fonction utilitaire comme:

function DumpVar($obj) { 
    echo "<pre>"; 
    var_dump($obj); 
    echo "</pre>"; 
} 

, s'il vous plaît noter également que l'utilisation de mémoire tampon de sortie (ob_start, etc.) est agréable, mais peut être sali par var_dump; quelque chose à surveiller si vous êtes dans une page dans une structure ob. Je suis tombé dessus parce que j'essayais de capturer une chaîne var_dump dans un buffer de sortie pour que les données JSON soient dislpayées dans un alert(). Vous serez en mesure de le résoudre, mais gardez cela à l'esprit. Un exemple d'approche réussie de HTML ob est dans le commentaire here.

+0

J'aimerais entendre pourquoi quelqu'un a rétrogradé cela. Je dois dire qu'en raison du manque de capacités de débogage en ligne dans PHP, ma petite fonction Dump() est mon appel le plus utilisé et le premier mensonge de défense lors du dépannage d'un nouveau problème. Vous ne savez pas quel est le XML que vous avez reçu d'un appel SOAP, ou les données json que vous avez créées, ou bien d'autres choses? Dump()! :) – zanlok

Questions connexes