2010-05-24 28 views
33

Mã PHP sau sẽ xuất 3.Phạm vi chênh lệch biến đổi giữa PHP và C: phạm vi khối không chính xác giống nhau?

function main() { 
    if (1) { 
     $i = 3; 
    } 
    echo $i; 
} 

main(); 

Nhưng mã C sau đây sẽ làm tăng lỗi biên dịch.

void main() { 
    if (1) { 
     int i = 3; 
    } 

    printf("%d", i); 
} 

Vì vậy, các biến trong PHP không bị chặn đúng phạm vi? Trong PHP, các biến được xác định trong khối bên trong có thể được sử dụng trong khối ngoài?

+1

Đây không thực sự là câu hỏi nếu bạn đã tự mình trả lời. –

+2

@Byron - Tôi chỉ muốn xác nhận điều này. Điều lạ lùng đối với tôi, những người đã đến với PHP từ C. – powerboy

+2

tại sao lại giảm giá? tôi nghĩ rằng câu hỏi là tốt đẹp – Andrey

Trả lời

45

PHP chỉ có phạm vi chức năng - các cấu trúc điều khiển chẳng hạn như if không giới thiệu phạm vi mới. Tuy nhiên, nó cũng không phiền nếu bạn sử dụng các biến mà bạn chưa khai báo. $i sẽ không tồn tại bên ngoài main() hoặc nếu câu lệnh if không thành công, nhưng bạn vẫn có thể tự do lặp lại.

Nếu bạn có cài đặt error_reporting của PHP để bao gồm thông báo, nó sẽ phát ra lỗi E_NOTICEkhi chạy nếu bạn cố sử dụng biến chưa được xác định. Vì vậy, nếu bạn có:

function main() { 
if (rand(0,1) == 0) { 
    $i = 3; 
} 
echo $i; 
}

Mã này sẽ chạy tốt, nhưng một số hành sẽ echo '3' (khi if thành công), và một số sẽ nâng cao một E_NOTICE và tiếng vang gì, như $i sẽ không được định nghĩa trong phạm vi của câu lệnh echo.

Ngoài chức năng, $i sẽ không bao giờ được xác định (vì hàm có phạm vi khác).

Để biết thêm thông tin: http://php.net/manual/en/language.variables.scope.php

+0

giải thích rất kỹ lưỡng! – powerboy

+2

Giải thích tốt! nhưng chỉ vì bạn có thể làm điều gì đó không có nghĩa là bạn nên làm. Thực tiễn không tốt là sử dụng biến chưa được xác định. –

+0

Ồ, và bạn không cần kiểm tra xem kết quả của cuộc gọi rand có bằng không. Bạn có thể chỉ cần đặt một shebang trước rand :) – peter