2009-11-24 5 views
6

J'ai cette fonction qui déclare variables:rendre les variables disponibles en dehors de la fonction en PHP?

function imageSize($name, $nr, $category){ 
    $path = 'ad_images/'.$category.'/'.$name.'.jpg'; 
    $path_thumb = 'ad_images/'.$category.'/thumbs/'.$name.'.jpg'; 
    list($width, $height) = getimagesize($path); 
    list($thumb_width, $thumb_height) = getimagesize($path_thumb); 
     ${'thumb_image_' . $nr . '_width'} = $thumb_width; 
     ${'thumb_image_' . $nr . '_height'} = $thumb_height; 
     ${'image_' . $nr . '_width'} = $width; 
     ${'image_' . $nr . '_height'} = $height; 
} 

Quand je fais écho ceci:

echo $image_1_width 

Il fonctionne très bien, mais si je le fais en dehors de la fonction qu'il reconnaisse wont la variable, comment puis-je les rendre «globaux» en quelque sorte?

Merci

Répondre

13

Je voudrais fortement conseiller PAS en utilisant global.

Ce qui sera probablement le meilleur est pour vous de revenir de la fonction:

function imageSize($name, $nr, $category){ 
    $path = 'ad_images/'.$category.'/'.$name.'.jpg'; 
    $path_thumb = 'ad_images/'.$category.'/thumbs/'.$name.'.jpg'; 
    list($width, $height) = getimagesize($path); 
    list($thumb_width, $thumb_height) = getimagesize($path_thumb); 
     ${'thumb_image_' . $nr . '_width'} = $thumb_width; 
     ${'thumb_image_' . $nr . '_height'} = $thumb_height; 
     ${'image_' . $nr . '_width'} = $width; 
     ${'image_' . $nr . '_height'} = $height; 

    $myarr = array(); 
    $myarr['thumb_image_' . $nr . '_width'] = $thumb_width; 
    $myarr['thumb_image_' . $nr . '_height'] = $thumb_height; 
    $myarr['image_image_' . $nr . '_width'] = $width; 
    $myarr['image_image_' . $nr . '_height'] = $height; 
    return $myarr; 

} 

$myImage = imageSize($name, $nr, $category);

vous accéder à chaque var:

echo $myImage['thumb_image_1_width']; 
echo $myImage['thumb_image_1_height']; 
echo $myImage['image_1_weight']; 
echo $myImage['image_1_height']; 

etc.

8

Vous devrez les définir en dehors de la fonction. Et à l'intérieur de la fonction utiliser le mot-clé global avant de les utiliser:

$someVar = null; 

function SomeFunc() { 
    global $someVar; 
    // change $someVar 
} 

// somewhere later 
SomeFunc(); 
echo $someVar; 

être conseillé cependant, que ce soit un choix de conception vraiment mauvais!

+4

D'accord. Je recommande que la fonction renvoie ces valeurs sous la forme d'un tableau plutôt que d'utiliser des globales. –

+0

pourquoi est-ce mauvais? donne moi aussi quelques arguments ... –

+3

Si vous utilisez des globals, vous ne savez jamais quand et qui va les modifier et cela casse le flot du code. Regardez quelques-unes des suggestions dans d'autres réponses pour obtenir des indices sur la façon de réécrire votre fonction (indice: renvoyer les choses dont vous avez besoin) –

-1
$var = 4; 

function bla() 
{ 
    global $var; 
    return $var; 
} 

Il retourne 4, car la variable est globale. J'espère que c'est ce que vous voulez.

+1

retour est très différent de l'écho. – davethegr8

0

retour la valeur à l'intérieur de la fonction au lieu d'utiliser des globales

1

Il semble que vous souhaitiez implémenter une classe plutôt qu'une fonction. Quelque chose comme:

class myImage { 

    function __construct($name, $nr, $category){ 
     $path = 'ad_images/'.$category.'/'.$name.'.jpg'; 
     $path_thumb = 'ad_images/'.$category.'/thumbs/'.$name.'.jpg'; 
     list($width, $height) = getimagesize($path); 
     list($thumb_width, $thumb_height) = getimagesize($path_thumb); 
     $this->{'thumb_image_' . $nr . '_width'} = $thumb_width; 
     $this->{'thumb_image_' . $nr . '_height'} = $thumb_height; 
     $this->{'image_' . $nr . '_width'} = $width; 
     $this->{'image_' . $nr . '_height'} = $height; 
    } 
} 

$image= new myImage($name, $nr, $category); 
echo $image->'image_1_width'; 

Bien sûr, avec ce genre de construction, vous n'avez pas besoin d'assembler des noms de variables. Vous pouvez simplement avoir $image->width.

2

Vous pouvez également créer un tableau ou un objet, puis le renvoyer, par exemple.

$dimensions[$nr] = imageSize($name,$category); 
echo "Thumb width " . $dimensions[$nr]['thumb_width']; 

Puis dans la fonction elle-même

function imageSize($name, $category) 
{ 
    $path = 'ad_images/'.$category.'/'.$name.'.jpg'; 
    $path_thumb = 'ad_images/'.$category.'/thumbs/'.$name.'.jpg'; 
    list($width, $height) = getimagesize($path); 
    list($thumb_width, $thumb_height) = getimagesize($path_thumb); 

    $rsvp = Array(); 
    $rsvp['thumb_width'] = $thumb_width; 
    $rsvp['thumb_height'] = $thumb_height; 
    $rsvp['image_width'] = $width; 
    $rsvp['image_height'] = $height; 

    return $rsvp; 
} 
1

I @ deuxième réponse de Lizard. En outre, il semble que la lecture sur variable scope un peu ne va pas mal. (Notez que ce lien contient des explications sur la façon d'utiliser les variables globales.Comme beaucoup l'ont dit, c'est pas la meilleure route à descendre.)

2

Je suis surpris que personne n'ait pensé à vous parler d'extrait . Il prendra les valeurs d'un tableau et les transformera en variables locales.Donc, dans ce cas:

function imageSize($name, $nr, $category){ 
    $path = 'ad_images/'.$category.'/'.$name.'.jpg'; 
    $path_thumb = 'ad_images/'.$category.'/thumbs/'.$name.'.jpg'; 

    $myarr = array(); 
    $myarr['thumb_image_' . $nr . '_width'] = $thumb_width; 
    $myarr['thumb_image_' . $nr . '_height'] = $thumb_height; 
    $myarr['image_image_' . $nr . '_width'] = $width; 
    $myarr['image_image_' . $nr . '_height'] = $height; 
    return $myarr; 

} 

$myImage = imageSize('myName', 'foo', $category); 
extract($myImage); 

Vous avez maintenant les variables,

$thumb_image_foo_width; 
$thumb_image_foo_height; 
$image_image_foo_width; 
$image_image_foo_height; 

portée locale.

+0

Bon point! Je ne connaissais pas 'extract()' avant. J'ai toujours utilisé: 'while (list ($ key, $ val) = each ($ array)) {$$ key = $ val;}'. + 1. – Kit

0

Si vous déclarez la variable dans le tableau $ GLOBALS, vous l'ajouterez à la portée globale. Comme d'autres l'ont mentionné, les globals doivent être initialisés dans la portée globale, par exemple à NULL.

Questions connexes