即使将其设置为全局变量,也无法在函数外部使用变量

Posted

技术标签:

【中文标题】即使将其设置为全局变量,也无法在函数外部使用变量【英文标题】:Can't use variable outside function even after setting it global 【发布时间】:2016-01-22 18:34:29 【问题描述】:

我制作了一个脚本来使用 php 的 GD 库生成缩略图。问题是原始图像位于分配给'gallery/'.$section;的各自目录中,而拇指将进入目录'gallery/thumbs/'.$section

现在,每次执行脚本时,我都希望它检查缩略图是否已经存在,如果不仅创建它,而且每当我调用函数并重新加载页面时,它每次都会创建新的缩略图。

我知道这是关于函数内外变量的范围,但我不知道它是什么。我尝试将变量设置为全局变量,但仍然无法解决。

这是预先声明。 idir 用于图像目录,tdir 用于拇指目录。

<?php
$idir = "gallery/".$section.'/';
$tdir="gallery/thumbs/".$section.'/';
if(!file_exists($tdir))
mkdir($tdir);

这是我正在使用的功能。

function createThumbs($idir, $tdir, $tw, $th)
    $dir=opendir($idir);
    while(($fname = readdir($dir)) != false)
        if($fname!='.' && $fname != '..')
        $img = imagecreatefromjpeg($idir.$fname);

        $width = imagesx($img);
        $height = imagesy($img);

        if($width>$height)
            $new_width=$tw;
            $new_height=$height*($tw/$width);
        
        if ($width < $height) 
        
            $new_width=$width*($th/$height);
            $new_height=$th;
        
        if ($width == $height) 
        
            $new_width=$tw;
            $new_height=$th;
        


        $tmp_img = imagecreatetruecolor($new_width, $new_height);
        imagecopyresampled($tmp_img, $img, 0,0,0,0, $new_width, $new_height, $width, $height);

        imagejpeg($tmp_img, $tdir.$fname, 100);

        imagedestroy($tmp_img); 
        imagedestroy($img); 
    

closedir($dir); 

在此之后,我正在调用这样的函数。

if (!file_exists($tdir.$fname)) 
    createThumbs($idir,$tdir,250, 200);

在调用函数时也会报错 - undefined variable .$fname

【问题讨论】:

这意味着 $fname 尚未定义...根据显示的代码,它尚未定义。 $fname = readdir($dir) 好的,你在函数中有$fname,但是file_exists子句中的$fname是什么? 是的,这就是问题所在。我想检查 $fname 是否存在并且我想在函数之外检查它。 那么$fname这个函数外的值是多少?你设置它还是什么? 【参考方案1】:

您在函数内初始化$fname 的值,然后当您第一次尝试获取$fname 值时,它从未被初始化,因此您得到错误。

它可以帮助你在 while 循环中移动 if 语句:

function createThumbs($idir, $tdir, $tw, $th)

    $dir=opendir($idir);
    while(($fname = readdir($dir)) != false)
        if($fname!='.' && $fname != '..' && !file_exists($tdir.$fname))
        $img = imagecreatefromjpeg($idir.$fname);

        $width = imagesx($img);
        $height = imagesy($img);

        if($width>$height)
            $new_width=$tw;
            $new_height=$height*($tw/$width);
        
        if ($width < $height) 
        
            $new_width=$width*($th/$height);
            $new_height=$th;
        
        if ($width == $height) 
        
            $new_width=$tw;
            $new_height=$th;
        


        $tmp_img = imagecreatetruecolor($new_width, $new_height);
        imagecopyresampled($tmp_img, $img, 0,0,0,0, $new_width, $new_height, $width, $height);

        imagejpeg($tmp_img, $tdir.$fname, 100);

        imagedestroy($tmp_img); 
        imagedestroy($img); 
        
    
    closedir($dir); 

然后总是调用缩略图创建:

//if (!file_exists($tdir.$fname)) 
    createThumbs($idir,$tdir,250, 200);
//

【讨论】:

是的。这有帮助。谢啦。但是你确定这是最有效的方法吗? 不确定此解决方案的效率,它只是修复了您提出的代码。我建议您为此使用分析器。

以上是关于即使将其设置为全局变量,也无法在函数外部使用变量的主要内容,如果未能解决你的问题,请参考以下文章

变量作用域

寄存器中的全局变量

05-函数作用域

js 闭包

js 闭包

js-闭包