2009-11-24 25 views
6

tôi có chức năng này mà tuyên bố biến:làm cho các biến có sẵn bên ngoài chức năng trong 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; 
} 

Khi tôi vang này:

echo $image_1_width 

Nó hoạt động tốt, nhưng nếu tôi làm điều đó NGOÀI chức năng nó sẽ không nhận ra sự thay đổi, thế nào tôi có thể làm cho chúng 'toàn cầu' bằng cách nào đó?

Cảm ơn

Trả lời

13

Tôi đặc biệt khuyên bạn NOT sử dụng toàn cầu.

gì có lẽ sẽ tốt nhất là để bạn có thể trở về từ chức năng:

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

sau đó bạn truy cập mỗi var:

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

, vv

8

Bạn sẽ phải xác định chúng bên ngoài chức năng. Và bên trong hàm sử dụng từ khóa chung trước khi bạn sử dụng chúng:

$someVar = null; 

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

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

được thông báo rằng đây thực sự là một lựa chọn thiết kế tồi!

+4

Đồng ý. Tôi khuyên bạn nên có chức năng trả về các giá trị như một mảng thay vì sử dụng globals. –

+0

tại sao nó xấu? cung cấp cho tôi một số đối số ... –

+3

Nếu bạn đang sử dụng globals bạn không bao giờ biết khi nào và ai sẽ sửa đổi chúng và nó phá vỡ dòng chảy của mã. Xem xét một số gợi ý trong các câu trả lời khác để tìm manh mối về cách viết lại chức năng của bạn (gợi ý: trả lại nội dung bạn cần) –

-1
$var = 4; 

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

Nó sẽ trở lại 4, bởi vì các biến là toàn cầu. Hy vọng đây là những gì bạn muốn.

+1

trả lại khác với tiếng vọng. – davethegr8

0

trở lại giá trị bên trong hàm thay vì sử dụng globals

1

Có vẻ như bạn muốn triển khai lớp học thay vì chức năng. Một cái gì đó như:

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

Tất nhiên, với kiểu xây dựng này, bạn không phải dán cùng tên biến. Bạn chỉ có thể có $image->width.

2

Bạn cũng có thể tạo mảng hoặc đối tượng rồi trả về - ví dụ:

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

Sau đó, trong chức năng tự

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

Tôi thứ hai @ câu trả lời Lizard. Ngoài ra, có vẻ như việc đọc lên trên variable scope một chút sẽ không biến mất. (Lưu ý, liên kết mà không bao gồm giải thích về cách sử dụng các biến toàn cầu. Giống như nhiều người ở đây đã nói, đó là không con đường tốt nhất để đi xuống.)

2

Tôi ngạc nhiên rằng không ai nghĩ rằng để cho bạn biết về giải nén . Nó sẽ lấy các giá trị từ một mảng và biến chúng thành các biến cục bộ.Vì vậy, trong trường hợp này:

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

Bạn sẽ bây giờ có các biến,

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

trong phạm vi địa phương.

+0

Điểm tuyệt vời! Tôi không biết về 'extract()' trước đây. Tôi luôn luôn sử dụng: 'while (danh sách ($ key, $ val) = mỗi ($ array)) {$$ key = $ val;}'. + 1. – Kit

0

Nếu bạn khai báo biến là một phần của mảng $ GLOBALS, bạn sẽ thêm nó vào phạm vi toàn cục.

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

Như những người khác đã đề cập, hình cầu phải được khởi tạo trong phạm vi toàn cầu, ví dụ như NULL.

Các vấn đề liên quan