在PHP中使用函数外部变量?

时间:2009-11-24 17:09:28

标签: 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;
}

当我回应这个时:

   echo $image_1_width

它工作正常,但是如果我在外面执行它不会识别变量的函数,我怎么能以某种方式使它们成为“全局”?

由于

10 个答案:

答案 0 :(得分:13)

我强烈建议使用全球。

从函数返回可能最好的是:

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

然后你访问每个var:

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

答案 1 :(得分:9)

您必须在函数之外定义它们。在函数内部使用global关键字之前使用它:

$someVar = null;

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

// somewhere later
SomeFunc ();
echo $someVar;
但是,请注意,这是一个非常糟糕的设计选择!

答案 2 :(得分:2)

你也可以创建一个数组或一个对象然后返回 - 例如

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

然后在函数本身

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

答案 3 :(得分:2)

我很惊讶没有人想过要提醒你。它将从数组中获取值并将它们转换为局部变量。所以,在这种情况下:

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

您现在将拥有变量

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

在当地范围内。

答案 4 :(得分:1)

听起来好像你想要实现一个类而不是一个函数。类似的东西:

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

当然,通过这种结构,您不必将变量名称粘合在一起。你可以$image->width

答案 5 :(得分:1)

我是第二个@Lizard的回答。而且,听起来好像读variable scope有点不会有问题。 (注意,该链接确实包含了如何使用全局变量的说明。就像许多人所说的那样,不是最好的道路。)

答案 6 :(得分:0)

答案 7 :(得分:0)

返回函数内部的值,而不是使用全局变量

答案 8 :(得分:0)

如果将变量声明为$ GLOBALS数组的一部分,则将其添加到全局范围。

$GLOBALS['variable name'] = 'value';

正如其他人所提到的,全局变量应该在全局范围内初始化,例如为NULL。

答案 9 :(得分:-1)

$var = 4;

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

它将返回4,因为变量是全局变量。希望这是你想要的。