2010-11-05 19 views
13

Bien, parece que tengo un concepto erróneo con alcance variable con PHP, perdone mi falta del tema ya que provengo de un fondo Java, C#. Pensando que podría hacer que las variables sean accesibles para funciones o declaraciones simplemente colocándolo fuera de él. A continuación se muestra un fragmento de lo que estoy tratando de lograr:Problema de alcance variable con sentencias if (PHP)

foreach ($nm as $row=>$im) { 
    $itm_name = $im; 
    $lnk = $lnk_cty[$row]; 
    if($mode == 'addMenu') { 
     $m = $m_id; //id will be coming from fresh insert of menu_name 
    } else { 
     $m = $_POST['mnu_add'][$row]; 
     echo "MENU_ID: ".$m; 
    } 
    if($mode == 'addCat') { 
     $m = $c_id; //id will be coming from fresh insert of cat_name 
    } else { 
$m = $_POST['cat_add'][$row]; 
    } 
    //used for testing purposes 
    echo "item name: ".$itm_name ."<br />"; 
    echo "lnk: ".$lnk ."<br />"; 
    echo "m: ".$m ."<br />"; //$m is empty here, because its a new declaration as oppose to accessing $m value from if statement 
    $display_fields .= "<li>".$itm_name." ".$item."</li>"; 
    $sql_array[] = '("' . $itm_name . '", "' . $lnk . '", ' . $m . ')'; // Add a new entry to the queue 
} 

Ahora lo que estoy tratando de hacer es hacer que los valores de las variables $m accesible fuera del if su adentro a la variable $m utilizado en la declaración $sql_array[] . En C#, simplemente declararía una variable fuera del ciclo foreach y podría usarla. Después de leer el asunto, descubrí que usar las palabras clave globales o GLOBALES solo funcionaría si mi variable de ámbito global es asignar el valor antes que el foreach y declarar global $m para obtener ese valor dentro del ciclo. Pero con mi código actual $m tiene un alcance local dentro de las declaraciones if y todos desaniman su uso. Ahora, ¿hay un mejor método para hacer que $m esté accesible para la declaración $sql_array[]?

+0

¿qué significa: 'id * will be * coming?' –

+0

La fuente de la ID sería ... –

+0

@ Aurel300 gracias mr. Traductor. ¿Podría indicar el valor real de $ m_id en el tiempo de ejecución? –

Respuesta

54

If bloques de instrucciones no tienen su propio alcance. Los datos que asigne a $m deben estar vacíos para comenzar. Intenta depurar cosas como tus variables $_POST. Además, ¿dónde se define $m_id? Quizás esté vacío también.

PHP tiene tiene alcance dentro de funciones, métodos de clase y similares. Pero las declaraciones if no tienen su propio alcance. Por ejemplo, el código siguiente se haría eco de Hi there!:

$bool = true; 
if ($bool) { 
    $new_var = 'Hi there!'; 
} 
echo $new_var; 

tener una lectura en el manual.

+0

Lo que está tratando de decir es que cuando se pone una declaración var en una instrucción if, la variable ya no estará disponible fuera de ella. –

+2

Sé lo que dice, pero esto no es cierto en PHP. – Stephen

+0

Sí. Lo siento, un poco fallado: D –

-1

Es cierto que if las declaraciones NO tienen alcance, pero parece que hay un problema con el alcance (fragmento de código entre llaves) .. en el siguiente fragmento de código el resultado esperado es: $ z [0] = 0, $ z [1] = 1 pero el resultado real obtenido es $ z [0] = 100; y $ z [1] no está definido. El PHP usado es de Apache Friends distribución

<?php 

$x = 0; 
$y = 1; 
$z[0]=100; 

if($x!=0){ 
    $z[0]=1; 
    $z[1]=2; 
    $z[2]=3; 
    $z[3]=4; 
}else{ 
    if($y == 0){ 
     $a =1; 
    }else{ 
     global $z; 
     echo $z[0]; 
     echo $z[1]; 
    } 
} 

?> 
+0

He editado su código y ahora es correcto. +1 –

1

aquí la variable $ id_struct no está establecida, ¿qué debo hacer?

if(!$struct_req) { 
       mysql_query("insert into structure values (null, 3,'".$_POST["structure"]."')") or die("insert structure : ". mysql_error()); 
       if(isset($id_struct)) echo "isset <br>"; 
       $id_struct = mysql_insert_id(); 
}else { 
       //global $id_struct; 
       $id_struct = mysql_fetch_array($struct_req)["id_structure"]; 

} 
echo $id_struct; 
Cuestiones relacionadas