2013-11-14 20 views
8

Vì vậy, tôi đã tạo một biểu mẫu ngày hôm nay và đã xảy ra để cung cấp cho tên của một biến cùng tên với tên được sử dụng sau này trong vòng lặp foreach. Trước sự ngạc nhiên của tôi, tuyên bố của vòng lặp foreach đã ghi đè khai báo trước đó của biến.PHP cùng tên trong foreach như phạm vi bên ngoài gây ra ghi đè

Với tôi, điều này có vẻ hơi lạ vì tôi đã mong đợi phạm vi của as $value => $a để giới hạn phạm vi của hai biến thành vòng lặp foreach.

Đây là những gì sẽ xảy ra:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; }; 
123 
php > echo $a; 
3 

Đây là những gì tôi mong đợi:

php > $a = 5; //define a in outer scope 
php > $b = array(1,2,3); 
php > foreach($b as $value => $a){ echo $a; /* This $a should be the one from the foreach declaration */ }; 
123 
php > echo $a; //expecting inner scope to have gone away and left me to get the outer scoped $a 

Điều tương tự cũng sẽ xảy ra nếu tôi sử dụng $a là chìa khóa của foreach vòng lặp, nhiều đáng sợ là đá quý này:

php > $a = 5; 
php > $b = array(1,2,3); 
php > foreach($b as $a => $b){ var_dump($b); } 
int(1) 
int(2) 
int(3) 
php > var_dump($b) // => int(3) 

ghi đè $b mảng tại chỗ, nhưng vẫn lặp qua các thành viên của nó.

Tất cả trong tất cả có vẻ hơi kỳ quặc. Câu hỏi của tôi, là hỏi chính xác nơi tôi sẽ tìm thấy tài liệu hướng dẫn/hướng dẫn mà xác định rằng hành vi này dự kiến?

+7

Phạm vi của PHP ở cấp chức năng. foreach() không tạo ra phạm vi mới. Điều đó đang được nói, sẽ có một "bí danh" tạm thời được tạo trong trường hợp của phiên bản $ b => $ b thứ hai của bạn. Đó là nhiều hơn một tác dụng phụ của internals php hơn một phạm vi mới được tạo ra, tuy nhiên. –

+0

Phạm vi không được thực hiện ở cấp vòng lặp? – EdgeCaseBerg

+0

Không. Có 2 phạm vi trong php. toàn cầu và hàm/phương thức cục bộ. –

Trả lời

1

Chỉ chức năng tạo ra một phạm vi mới. phạm vi khối hình thành bởi các dấu ngoặc nhọn không tạo thành một cái mới. Trong ví dụ của bạn, bạn đang ở trong phạm vi toàn cục.

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