2013-02-20 13 views
16

Có thể gửi kèm các đoạn mã trong PHP trong dấu ngoặc vuông (không sử dụng đoạn dưới dạng hàm) không?Sử dụng dấu ngoặc nhọn cho mã cấu trúc trong PHP

Mã sau có hoạt động giống như cách không có dấu ngoặc nhọn không? Hoặc có thể có bất kỳ vấn đề tùy thuộc vào loại mã được sử dụng bên trong hoặc bên ngoài dấu ngoặc vuông?

Ví dụ, sẽ này:

<?php 

// First Code-Block 
{# several lines of code 
} 

// Second Code-Block 
{# another several lines of code 
} 

?> 

Luôn cư xử theo cùng một cách như thế này:

<?php 

// First Code-Block 
# several lines of code 

// Second Code-Block 
# another several lines of code 

?> 
+0

Bạn có nghĩa là, không có một cái gì đó như 'if (true) {... } '? Cho mục đích gì? – user113215

+0

Tôi thực sự muốn thấy điều này thực hiện một cách để chúng tôi quản lý thu gom rác bằng cách gói một phần mã lên mà có thể được thu thập một cách an toàn khi phân đoạn/câu lệnh được thực hiện. – superhero

+0

nó thực sự hữu ích khi bạn có nhiều phần mã và cuộn sẽ gặp rắc rối theo thời gian khi bạn có trình chỉnh sửa cho phép bạn "thu gọn" khối, giúp bạn tập trung vào mã ngay bây giờ – My1

Trả lời

4

Hành vi mã PHP không thay đổi nếu bạn đính kèm nó trong dấu ngoặc nhọn. Tuy nhiên, bạn không thể sử dụng một số câu lệnh PHP bên trong dấu ngoặc nhọn:

  • namespace khai báo;
  • không gian tên use khai báo bí danh hoặc nhập bất kỳ tên nào;
  • tuyên bố toàn cầu const;
  • __halt_compiler().

Điều này có nghĩa, các kịch bản sau đây sẽ làm việc:

<?php 
const x = 5; 
echo x; 

nhưng sau đây sẽ không biên dịch:

<?php 
{ 
    const x = 5; 
    echo x; 
} 
26

Có, nhưng nó sẽ không tạo ra một phạm vi địa phương mới. Nó không phải là một cái gì đó mà thường sẽ được thực hiện. Thông thường mọi người đánh dấu các khối như thế này với các bình luận.

Cập nhật:

Phải mất một chút đào bới để tìm một tham chiếu đến nó trong cuốn hướng dẫn, nhưng ở đây nó là:

http://www.php.net/manual/en/control-structures.intro.php

Bất kỳ kịch bản PHP được xây dựng ra của một loạt các câu lệnh. Một câu lệnh có thể là một nhiệm vụ, một cuộc gọi hàm, một vòng lặp, một câu lệnh có điều kiện hoặc thậm chí một câu lệnh không làm gì cả (một câu lệnh rỗng). Các câu lệnh thường kết thúc bằng dấu chấm phẩy. Ngoài ra, các câu lệnh có thể được nhóm lại thành một nhóm tuyên bố bằng cách đóng gói một nhóm các câu lệnh với các dấu ngoặc nhọn. Một nhóm tuyên bố là một tuyên bố của chính nó là tốt. Các loại câu lệnh khác nhau được mô tả trong chương này.

Chìa khóa ở đây là các câu lệnh có thể được nhóm thành nhóm tuyên bố bằng cách đóng gói một nhóm câu lệnh với dấu ngoặc nhọn.

Tôi cũng đã có một cái nhìn cho một tham chiếu đến variable scope vì nó liên quan đến tình trạng này, nhưng hướng dẫn không đề cập cụ thể nó, tuy nhiên bạn có thể nghĩ về nó như thế này:

Trong PHP, chức năng và các lớp học tạo một phạm vi biến. Bạn có thể đọc về điều đó here. Nhưng một nhóm tuyên bố (như đã mô tả ở trên) thì không. Đừng nghĩ đến các dấu ngoặc nhọn của một nhóm câu lệnh giống như khung ngoặc (hoặc lớp) của hàm, nhưng hãy nghĩ về chúng như các dấu ngoặc nhọn bọc nhóm câu lệnh của các cấu trúc điều khiển (if, for, while, switch, v.v ... .) - bởi vì đó là chính xác những gì họ đang có. Rõ ràng là nếu bạn đang sử dụng câu lệnh if (hoặc bất kỳ cấu trúc điều khiển nào khác) mà niềng răng không đưa ra phạm vi mới, chúng chỉ đơn giản là trình bao bọc cho một khối câu lệnh.

+1

Vâng tôi không thể nghĩ ra một lý do chính đáng để làm điều này. Nếu nó không có chức năng yêu cầu '{}' (như các cấu trúc điều khiển, các hàm, vv ..) thì nó có vẻ ngớ ngẩn và khó hiểu để làm điều đó. – prodigitalson

+1

@Luke Mill: Cảm ơn, tôi có thể tìm thông tin này trong tài liệu tham khảo PHP ở đâu (Tôi đang tìm kiếm các độ tuổi trước khi tôi hỏi)? – Albin

+2

@prodigitalson: Lý do: Tôi phải sử dụng trình chỉnh sửa mã với cài đặt gốc (notepad ++) chỉ chứa các khối nhận xét (*// *) và khối chức năng ({}). – Albin

0

Tôi cũng làm điều này, chỉ vì trình soạn thảo văn bản của tôi (Komodo Edit 8.5). Nó không phải là một "lý do xấu" hoặc "mã hóa xấu", nếu nó giúp bạn và không gây ra bất kỳ vấn đề và nếu không có cách nào khác dễ dàng để làm điều đó.

tôi giải quyết vấn đề với một công việc xung quanh:

if(1 == 1){ //always executing if function 
//whatever you want to add 
} 
# 

thêm một # ở cuối ngăn biên tập của tôi từ sụp đổ tất cả các dòng sản phẩm nào dưới dấu ngoặc nhọn. Điều này giúp cấu trúc thêm mã.

4

Trong một dự án tôi đang làm việc trên, tôi sử dụng tuyên bố nhóm để chỉ ra cấu trúc - trong trường hợp của tôi, mối quan hệ cha/con giữa các nút tạo ra trong một router:

$router = new Router(); 

$admin = $router->route('admin'); 
{ 
    $upload = $admin->route('upload')->post('upload'); 

    $menu = $admin->route('menu'); 
    { 
     $menu->route('load')->get('load'); 
     $menu->route('save')->get('save'); 
    } 
} 

`` `

bên trong, này xây dựng một cấu trúc phân cấp như:

/admin 
    /upload 
    /menu 
    /load 
    /save 

Calling route() trong ví dụ này tạo ra một đứa trẻ - vì vậy mã tạo ra một mô hình (bên trong router) mà có cấu trúc cây, nhưng cấu trúc của mã không phản ánh điều đó.

Tôi đang sử dụng dấu ngoặc nhọn vào đây để làm cho đoạn code rõ ràng hơn, vì đọc mã mà không dấu ngoặc nhọn và thụt đầu dòng sẽ là khá khó khăn:

$router = new Router(); 

$admin = $router->route('admin'); 
$upload = $admin->route('upload')->post('upload'); 
$menu = $admin->route('menu'); 
$menu->route('load')->get('load'); 
$menu->route('save')->get('save'); 

lõm trong trường hợp này thực sự làm rõ những gì đang xảy ra, tôi nghĩ .