Có phải thực tế xấu khi sử dụng thẻ <? = Trong PHP?


190

<?= ?>Gần đây tôi đã bắt gặp thẻ PHP này và tôi không muốn sử dụng nó, nhưng nó rất khó để tôi muốn bạn sử dụng nó. Tôi biết đó là một thực tế xấu khi sử dụng các thẻ ngắn <? ?>và thay vào đó chúng ta nên sử dụng các thẻ đầy đủ <?php ?>, nhưng điều này thì sao : <?= ?>?

Nó sẽ tiết kiệm một số thao tác gõ và sẽ tốt hơn cho khả năng đọc mã, IMO. Vì vậy, thay vì điều này:

<input name="someVar" value="<?php echo $someVar; ?>">

Tôi có thể viết nó như thế này, sạch hơn:

<input name="someVar" value="<?= $someVar ?>">

Là sử dụng toán tử này nhăn mặt?


11
Vấn đề với loại câu hỏi này là nó rất quan điểm. Có "về mặt kỹ thuật" không phải là một cách đúng hay sai. Một số tranh luận cho, một số chống lại, tất cả các ưu tiên của nó. Vì vậy, cuối cùng nó phụ thuộc vào bạn.
mseancole

Tránh thẻ đóng dưới mọi hình thức, nếu bạn có thể - tức là tệp chỉ chứa mã php (không có html, v.v.). Nếu bạn có thẻ đóng, bất kỳ ký tự nào sau nó sẽ được xuất ra trình duyệt (đối với ứng dụng web) - điều này có thể dẫn đến các vấn đề rất khó gỡ lỗi. Để biết thêm: stackoverflow.com/a/4453835/49560
dharm0us

Không liên quan đến ý kiến: Coi chừng vì echorất dễ dẫn đến XSS và tốt hơn là bạn nên dựa vào phương pháp lặp lại dành riêng cho ngữ cảnh (nghĩa là: có function html($x) { echo htmlentities($x,...); }và không html($someVar);thay vì echo $someVarhoặc sử dụng echo json_encode($x);cho ngữ cảnh JS). Điều này sau đó làm cho <?=các thẻ trở thành một thông lệ xấu bởi vì điều đó có nghĩa là bạn đã thoát HTML nội dung biến ở một nơi khác và để nơi khác phải biết một cách kỳ diệu biến này phải được thoát HTML vì nó lặp lại trong ngữ cảnh HTML.
Xenos

Câu trả lời:


211

Lịch sử

Trước khi tàu thông tin sai lệch đi quá xa nhà ga, có một loạt điều bạn cần hiểu về các thẻ ngắn PHP.

Vấn đề chính với các thẻ ngắn của PHP là PHP quản lý để chọn một thẻ ( <?) được sử dụng bởi một cú pháp khác, XML .

Với tùy chọn được bật, bạn không thể xuất khai báo xml mà không gặp lỗi cú pháp:

<?xml version="1.0" encoding="UTF-8" ?>

Đây là một vấn đề lớn khi bạn xem xét mức độ phổ biến của quản lý và phân tích cú pháp XML.

Thế còn <?=?

Mặc dù <?gây ra xung đột với xml, <?= nhưng không . Thật không may, các tùy chọn bật và tắt nó được gắn với short_open_tag, điều đó có nghĩa là để có được lợi ích của thẻ echo ngắn ( <?=), bạn phải xử lý các vấn đề của thẻ mở ngắn ( <?). Các vấn đề liên quan đến thẻ mở ngắn lớn hơn nhiều so với lợi ích từ thẻ echo ngắn, vì vậy bạn sẽ tìm thấy một triệu rưỡi khuyến nghị để short_open_tagtắt, mà bạn nên làm .

Tuy nhiên, với PHP 5.4, thẻ echo ngắn đã được bật lại tách biệt với short_open_tagtùy chọn. Tôi thấy điều này như một sự chứng thực trực tiếp về sự tiện lợi của nó <?=, vì về cơ bản không có gì sai với nó cả.

Vấn đề là bạn không thể đảm bảo rằng bạn sẽ có <?=nếu bạn đang cố gắng viết mã có thể hoạt động trong phạm vi rộng hơn của các phiên bản PHP.

ok, vậy bây giờ đó là tất cả

Bạn có nên sử dụng <?=?

lưu đồ về việc có sử dụng thẻ echo ngắn hay không


71
Tôi không đồng ý với sơ đồ linh hoạt của bạn. Câu trả lời đúng là 99,99% CÓ vì hầu hết các môi trường sản xuất được cấu hình để sử dụng các thẻ ngắn. Giả sử bạn thổi nó và họ loại bỏ <?=trong tương lai bạn có thể sửa chữa nó trong vòng chưa đầy một phút, dù có bao nhiêu hàng ngàn tập tin sử dụng nó, bạn chỉ cần thực hiện tìm kiếm dự án rộng và thay thế của <?=cho <?php echo . Câu trả lời của tôi là đừng lo lắng và chỉ cần sử dụng nó , lợi ích vượt trội rất nhiều về hậu quả. <?=không được coi là một thẻ ngắn nữa, chính Rasmus Lerdorf đã thực hiện điều đó rất cam kết.
dukeofgaming

32
@dukeofgaming, bạn lấy dữ liệu về môi trường sản xuất được cấu hình để sử dụng các thẻ ngắn ở đâu? Vô hiệu hóa chúng là một trong những cấu hình được đề xuất phổ biến nhất mà tôi đã nghe nói, chỉ đứng sau việc vô hiệu hóa các trích dẫn ma thuật. Nó cũng hoàn toàn không có ý nghĩa khi có một môi trường phát triển khác với sản xuất.
zzzzBov

4
Tags ngắn đã được kích hoạt theo mặc định cho đến 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag , hầu hết các dịch vụ lưu trữ Tôi biết hỗ trợ nó không có vấn đề và điều này là một trong những lý do khuôn khổ Kohana dùng để khuyến khích nó <?=sẽ luôn bật ( stackoverflow.com/a/6064813/156257 ) và hầu hết thời gian họ từng sử dụng. Bạn có thể chứng minh tôi sai bằng cách kiểm tra với máy chủ của mình nếu: chúng bị vô hiệu hóa và sử dụng PHP <5.3 nếu chúng không cho phép cài đặt bị người dùng quá tải hoặc theo yêu cầu đặc biệt; nếu tất cả những điều trước là sai, bằng mọi cách lo lắng <?=.
dukeofgaming

6
Bạn không lo lắng điều đó <?=sẽ bị xóa, và tôi cũng vậy. Những người khác có thể, và nếu có, họ không phải sử dụng <?=. Một số người có nỗi sợ phi lý khi sử dụng các tính năng ngôn ngữ nhất định ( như bỏ các thẻ đóng trong php ).
zzzzBov

8
Đó chính xác là quan điểm của tôi: không cần phải lo lắng . Tôi chỉ cần đặt "Bạn có lo lắng?" --yes -> "Hãy tiếp tục và sử dụng chúng, không cần phải lo lắng". Nó cũng có cảm giác như bạn đang ám chỉ rằng việc bỏ các thẻ đóng là một cách làm không tốt.
dukeofgaming

29

Quét sạch mũ PHP của tôi

Tôi chắc chắn sẽ thích sử dụng <?= $someVar ?>hơn dài dòng echo(đơn giản là sở thích cá nhân). Các chỉ AFAIK nhược điểm là cho những người dùng đang chạy trước 5.4.0, trong trường hợp này short_open_tagphải được cho phép trong php.ini .

Bây giờ đã nói rằng, nếu dự án của bạn không phải là hệ điều hành, thì đó là một điểm cần thiết. Nếu đúng như vậy, tôi sẽ ghi lại thực tế short_open_taglà phải bật hoặc sử dụng tính di động cao hơn của hai giải pháp.


1
Nitpick: Mặc dù <?=không bị ảnh hưởng bởi short_open_tagPHP 5.4, <?nhưng vẫn vậy và nếu bạn có thói quen sử dụng các thẻ dạng ngắn, thì rất dễ quên những gì được hỗ trợ trên phiên bản nào.
yannis

7
@YannisRizos Thật tốt khi phân biệt <?=là "Tôi đang xuất một biến ngay bây giờ" để sử dụng kiểu mẫu và <?phplà "Tôi hiện đang chạy rất nhiều mã". Tôi muốn đề nghị không bao giờ sử dụng <?, nhưng điều đó cả <?=<?phpcũng tốt.
Izkata

2
+1 vì Rasmus Lerdorf tán thành thẻ tốc ký <? =. Tôi đã xem một trong những bài nói chuyện của anh ấy về (5 sắp được phát hành) PHP 5.4. Đó là lý do tại sao kể từ PHP 5.4.0, thẻ <? = Luôn có sẵn. Tôi đã thấy rất nhiều mã trước PHP 5.4 rằng thẻ <? = Được sử dụng trong Chế độ xem của ứng dụng MVC nhưng <? Php ...?> Được sử dụng trong các tệp không xem.
lập trình viên

@Jason Đó không phải là những gì tôi đang nói. "Rasmus tán thành foo" không phải là một đối số, "Rasmus tán thành foo vì lý do này và lý do đó" tuy nhiên là vậy.
yannis

2
@Yannis Rizos "Rasmus tán thành foo vì lý do này và lý do đó" tuy nhiên là vậy. Cảm ơn vì đã dạy kèm, nhưng lý do của tôi là do Rasmus Lerdorf tán thành nó, là người tạo ra ngôn ngữ và vẫn có ảnh hưởng đến sự phát triển của PHP, các thay đổi đã được thực hiện để làm cho thẻ <? = Luôn có sẵn. Đây là những gì tôi nên đã thêm vào nhận xét ban đầu của mình "Do đó, việc sử dụng <? = Trong lượt xem có thể sẽ còn trở nên phổ biến hơn nữa." Dang, tôi sẽ cần kiểm tra lại ba bình luận của tôi bây giờ trên ... dấu chấm ...
lập trình viên

21

Bạn chắc chắn nên cố gắng tránh các thẻ dạng ngắn, cho dù đó là <?hay <?=.

Lý do kỹ thuật chính là tính di động, bạn không bao giờ có thể chắc chắn rằng các thẻ biểu mẫu ngắn sẽ hoạt động cho mọi thiết lập đã cho, vì chúng có thể bị tắt, tra cứu short_open_tagchỉ thị. Nhưng bạn luôn có thể hoàn toàn chắc chắn rằng hình thức dài sẽ hoạt động ở mọi nơi.

Nó sẽ tiết kiệm một số thao tác gõ và sẽ tốt hơn cho khả năng đọc mã, IMO.

Đó cũng là một thói quen xấu. Tôi thực sự không thể nói cho bạn biết những gì bạn thấy dễ đọc hơn, nhưng tôi đang sốt sắng chống lại việc sử dụng khả năng đọc mã như một cái cớ để tiết kiệm cho mình một vài tổ hợp phím. Nếu bạn lo lắng về khả năng đọc, bạn nên tìm một công cụ mẫu, điều này:

<input name="someVar" value="{someVar}">

dễ đọc hơn từ cả hai ví dụ của bạn.

Cuối cùng, điều đáng chú ý là các thẻ biểu mẫu ngắn được khuyến khích rõ ràng bởi các dự án PHP lớn, ví dụ PEARZend Framework .


14
+1 cho các mẫu. -1 cho tính di động. Đó là ngôn ngữ phía máy chủ. Những thách thức bạn cần tập trung vào một máy chủ là những thứ như khả năng mở rộng và bảo mật. Sẽ là một ý tưởng tồi tệ đáng kinh ngạc khi đầu tư thời gian nghiêm túc để đảm bảo rằng nó sẽ chạy trên nhiều nền tảng ... (chỉ trong trường hợp!) ...
riwalk

3
@ Stargazer712 Hửm? Điều duy nhất bạn cần làm là sử dụng tiêu chuẩn <?phpechothay vì <?<?=, bạn có tính đó là thời gian nghiêm trọng không? Và điều gì xảy ra khi bạn di chuyển dự án của mình đến một máy chủ trong đó vì một số lý do thẻ ngắn bị vô hiệu hóa?
yannis

13
@Yannis: vài nhân vật đó có vẻ không nhiều, nhưng IMO họ gây ra nhiều tiếng ồn.
kevin cline

8
Tôi nghĩ cần phải đề cập rằng mục đích ban đầu của PHP là trở thành một ngôn ngữ mẫu . Thêm một công cụ mẫu khác (nhiều phình to hơn) trên PHP không làm nổi thuyền cá ngừ của tôi. Chỉ cần làm theo các thực tiễn tốt (một số mẹo hay có ở đây stackoverflow.com/questions/62617/ mẹo ) khi mã hóa PHP trộn với HTML và bạn sẽ ổn.
lập trình viên

2
@Yannis Rizos Có nên đề cập đến vì những người mới sử dụng PHP có thể nghĩ rằng họ bắt buộc phải sử dụng công cụ mẫu [whizbang] trong các dự án PHP của họ mà không xem xét sử dụng PHP thuần túy. Tôi có nên chỉ xử lý văn bản trong Perl , có thể không nhưng tôi cho rằng bây giờ Perl khá giỏi trong việc xử lý văn bản - tương tự như vậy với PHP và tạo khuôn mẫu.
lập trình viên

15

Các PHP-Tài liệu nói rõ ràng mà bạn có thể sử dụng các thẻ vang ngắn một cách an toàn:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Mặc dù đây là phiên bản PHP 5.4 trở lên nhưng ít nhất mọi người nên sử dụng phiên bản này. Tôi chỉ thích chúng cho mục đích tạo khuôn mẫu.


10

Lý do sử dụng thẻ ngắn:

  • Chúng ngắn hơn.

Lý do không sử dụng thẻ ngắn:

  • Họ giới thiệu thêm một cấu hình gotcha - trong khi bạn kiểm soát máy chủ hầu hết thời gian trong bối cảnh chuyên nghiệp, nếu bạn dự định phát hành mã của mình ra công chúng, các thẻ ngắn có thể phá vỡ không thể sửa chữa đối với những người sử dụng nó trên, nói, lưu trữ được chia sẻ .
  • Chúng làm cho nó quá dễ dàng để thả các chuỗi không được khử trùng vào đầu ra của bạn. Điều này thật đáng sợ vì nó có thể giới thiệu các lỗ hổng XSS. Mặc dù các thẻ dài không làm gì trực tiếp để ngăn chặn điều này, nhưng chúng báo hiệu cho lập trình viên rằng có thể những gì họ đang làm không phải là điều đúng đắn và họ nên bắt đầu sử dụng một hệ thống mẫu tự động xử lý mã hóa HTML cho họ ngay bây giờ . Xuất ra các chuỗi động với các thẻ dài là đau đớn, đó là một điều tốt (giáo dục).

Đó là câu trả lời để chấp nhận IMO, ngay cả các mẫu tho sẽ không làm cho mọi thứ XSS an toàn (dữ liệu người dùng trong thuộc tính src của tập lệnh sẽ luôn không an toàn) và tôi không biết liệu cơ chế mẫu có nhận thức được bối cảnh lặp lại phù hợp hay không; Điều gì xảy ra nếu biến PHP kết thúc trong nội dung thẻ script? Trong một SVG được nhúng trong HTML?
Xenos

@Xenos rõ ràng phụ thuộc vào hệ thống mẫu được đề cập và không có viên đạn bạc; nhưng hầu hết trong số chúng làm giảm bề mặt lỗi và số lượng kịch bản cần sự siêng năng thủ công (nguồn lỗi bảo mật quan trọng nhất). "Không đặt nội dung động trong thẻ tập lệnh" dễ theo dõi (và kiểm toán) hơn "đảm bảo tất cả nội dung động được mã hóa HTML đúng cách ở mọi nơi".
tdammers

4

Tôi nghĩ rằng <?=phiên bản này là một thực tiễn tốt / có thể chấp nhận được, với điều kiện bạn chỉ sử dụng nó cho đầu ra cuối cùng của các biến và tránh mọi lệnh gọi hàm hoặc logic ba không liên quan trực tiếp đến việc trình bày dữ liệu.

Nó chắc chắn tốt hơn nhiều so với <? echo($x); ?>mọi nơi.

Về lâu dài, bạn có thể muốn xem xét các công cụ tạo khuôn mẫu như Smarty .


3
Smarty đã từng công cụ mẫu, nhưng ngay bây giờ nó là một mớ hỗn độn lỗi thời và lỗi thời, và bạn nên thực sự tránh xa.
yannis

2

Kể từ phiên bản PHP 7.4, sân chơi thay đổi một chút:

<? ?> được chính thức phản đối và sẽ bị xóa trong PHP 8.0.

PHP RFC: Không dùng các thẻ mở ngắn Các trạng thái rõ ràng <?= ?>không bị ảnh hưởng. Điều này sẽ chỉ ra (theo tôi, không phải RFC) rằng việc sử dụng nó không được khuyến khích.


-3

Thành thật mà nói, tôi nghĩ rằng việc lặp lại một kết quả cho dù phương thức là gì (thời trang cũ hay mới) là một cái gì đó khá lỗi thời trong khi MVC kỷ niệm 33 năm rồi.

Tôi sẽ nói rằng có, đây là một cách thực hành tốt để đóng gói dữ liệu máy chủ (php) đến trong một tài liệu XML và xử lý nó trong lớp ứng dụng / máy khách của bạn, do đó, giúp bạn tiết kiệm ngay cả ý tưởng sử dụng thẻ như vậy.


1
Trên thực tế, MVC kỷ niệm 33 năm, lần đầu tiên được phác thảo vào tháng 12 năm 1979 trong bài báo này .
yannis

vâng, tôi vẫn ở năm 2000, lỗi của tôi :-)
sebas

1
um ... Templating ... là templating lỗi thời? Là templating và MVC loại trừ lẫn nhau?
Tim Seguine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.