Các thẻ ngắn PHP có được chấp nhận để sử dụng không?


522

Đây là thông tin theo tài liệu chính thức :

Có bốn cặp thẻ mở và đóng khác nhau có thể được sử dụng trong PHP. Hai trong số đó, <?php ?><script language="php"> </script>, luôn luôn có sẵn. Hai cái còn lại là các thẻ ngắn và thẻ kiểu ASP và có thể được bật và tắt từ tệp cấu hình php.ini. Như vậy, trong khi một số người tìm thấy các thẻ ngắn và thẻ kiểu ASP thuận tiện, thì chúng ít di động hơn và thường không được khuyến nghị .

Theo kinh nghiệm của tôi hầu hết các máy chủ làm có thẻ ngắn được kích hoạt. Đánh máy

<?=

thuận tiện hơn nhiều so với gõ

<?php echo 

Sự tiện lợi của các lập trình viên là một yếu tố quan trọng, vậy tại sao họ không được khuyến khích?


61
Để trả lời whyphần này, tôi xin trích dẫn hướng dẫn chứng nhận Zend PHP 5: "Các thẻ ngắn, trong một thời gian, là tiêu chuẩn trong thế giới PHP, tuy nhiên, chúng có nhược điểm lớn là xung đột với các tiêu đề XML và do đó, có phần nào ngã bên đường. "
Fluffy

7
Trường hợp sử dụng khi vấn đề đó xuất hiện, điều đó có nghĩa là việc các nhà phát triển tạo XML bằng PHP có phải là một nỗi đau không?
Jon z

9
Giả sử bạn có các tài liệu XML mà bạn muốn công khai, nhưng bạn muốn các tài liệu đó có thể phân tích cú pháp php vì bất kỳ lý do gì để bạn tạo .xml có thể phân tích cú pháp bởi trình duyệt của bạn. Bạn sử dụng các thẻ ngắn để chúng được bật và đột nhiên tài liệu XML được phân tích cú pháp thông qua các tiêu đề XML, phá vỡ mọi thứ. Dạo tôi cố gắng để tìm ra điều này từ lâu. Kể từ khi các mã ngắn đã bị vô hiệu hóa trên bất kỳ máy chủ nào tôi chạy và bất kỳ nhóm nào tôi làm việc cùng đã phải sử dụng mã không ngắn
xem lại

43
Từ PHP 5.4.0, lệnh short_open_tag không bao gồm thẻ echo ngắn <?= $example;?> ! Điều này rất quan trọng vì việc sử dụng tất cả các thẻ ngắn khác được coi là vô ích. Dù sao, việc sử dụng thẻ echo ngắn được khuyến khích từ bây giờ. Nó cung cấp cho một cơ sở mã mượt mà và gọn gàng hơn - đặc biệt. trong xem tập tin. Vì vậy, đối với PHP> = 5.4.0 <?= ?> có thể được sử dụng mà không cần cài đặt short_open_tag . Vui lòng không sử dụng các thẻ ngắn khác trong mã của bạn. Các vị thần mã rất tức giận khi bạn làm như vậy ...
Borislav Sabev

6
Tôi sẽ thêm điều này như một nhận xét nhanh, bởi vì đã có quá nhiều câu trả lời dài: <?không chỉ được sử dụng trong XML cho khai <?xml version="1.0" ?>báo mở ; đó là cú pháp chung cho "hướng dẫn xử lý", ví dụ phổ biến thứ 2 là <?xml-stylesheet ... ?>. <?phpthực sự có thể được coi là một hướng dẫn xử lý hợp lệ, như có thể <?=(như được cho phép trong 5.4+), nhưng tuyên bố toàn bộ <?cũng tạo ra xung đột không cần thiết giữa các cú pháp.
IMSoP

Câu trả lời:


374

Chúng không được khuyến nghị vì đó là Pita nếu bạn phải di chuyển mã của mình đến máy chủ không được hỗ trợ (và bạn không thể bật mã này). Như bạn nói, rất nhiều vạn quân chia sẻ làm hỗ trợ shorttags nhưng "rất nhiều" không phải là tất cả trong số họ. Nếu bạn muốn chia sẻ tập lệnh của mình, tốt nhất nên sử dụng cú pháp đầy đủ.

Tôi đồng ý rằng <?<?=dễ dàng hơn đối với các lập trình viên hơn <?php<?php echonhưng có thể thực hiện tìm và thay thế hàng loạt miễn là bạn sử dụng cùng một hình thức mỗi lần (và không tặc lưỡi trong không gian (ví dụ: <? phphoặc <? =)

Tôi không mua khả năng đọc là một lý do cả. Hầu hết các nhà phát triển nghiêm túc có tùy chọn đánh dấu cú pháp có sẵn cho họ.

Như ThiefMaster đã đề cập trong các bình luận, kể từ phiên bản PHP 5.4, <?= ... ?>các thẻ được hỗ trợ ở mọi nơi, bất kể cài đặt shorttags . Điều này có nghĩa là chúng an toàn để sử dụng trong mã di động nhưng điều đó có nghĩa là sau đó phụ thuộc vào PHP 5.4+. Nếu bạn muốn hỗ trợ trước 5,4 và không thể đảm bảo rút ngắn, bạn vẫn cần sử dụng <?php echo ... ?>.

Ngoài ra, bạn cần biết rằng các thẻ ASP <%,%>, <% = và thẻ script được xóa khỏi PHP 7 . Vì vậy, nếu bạn muốn hỗ trợ mã di động dài hạn và muốn chuyển sang các công cụ hiện đại nhất, hãy xem xét thay đổi các phần của mã.


91
Vì vậy, giải thích là: Họ xấu vì không được hỗ trợ? Nhưng tại sao họ không được hỗ trợ? Bởi vì chúng không phải là một phần của đặc điểm kỹ thuật? Ok, nhưng tại sao chúng không phải là một phần của đặc điểm kỹ thuật? Tôi hơi thất vọng với câu trả lời này.
Josef Sábl

61
Tôi không ở đây để thảo luận về "những câu hỏi lớn" như tại sao chúng ta ở đây, mọi chuyện bắt đầu như thế nào, v.v. Hỗ trợ Shorttag không được đảm bảo trên các máy chủ dùng chung và nó bị xóa hoàn toàn phiên bản chính tiếp theo. Đó là tất cả những điều bạn cần biết.
Oli

39
PHP bắt buộc một công cụ mẫu. : P
Lỗi cú pháp

49
Các thẻ ngắn không được loại bỏ. Chỉ các thẻ ngắn kiểu ASP.
Brian Lacy

46
Trong tương lai (rất gần) của PHP 5.4, việc sử dụng <? = Sẽ được tách ra khỏi việc short_open_tags được bật hay tắt. <? = không bị loại bỏ, hoàn toàn ngược lại, giờ đây nó được coi là một phần cơ bản của ngôn ngữ.
Ông Griever

175

Tôi quá thích <?=$whatever?>để cho nó đi. Không bao giờ có vấn đề với nó. Tôi sẽ đợi cho đến khi nó cắn vào mông tôi. Nói một cách nghiêm túc, 85% khách hàng (của tôi) có quyền truy cập vào php.ini trong trường hợp hiếm hoi họ bị tắt. 15% khác sử dụng các nhà cung cấp dịch vụ lưu trữ chính và hầu như tất cả họ đều kích hoạt chúng. Tôi yêu họ.


41
@B Seven Nếu bạn cố gắng tránh mọi vấn đề lý thuyết có thể phát sinh, mã của bạn gần như chắc chắn sẽ không hiệu quả và có lỗi. Cho đến khi nhóm PHP đồng ý loại bỏ các thẻ ngắn ra [không phải thẻ ASP], thì nỗi lo bị cắn sẽ ít hơn rất nhiều và giải pháp tiềm năng đơn giản hơn nhiều so với những thứ khác mà bạn có thể dành thời gian để "sửa chữa".
Samoody

18
nếu nó cắn bạn, hãy chuyển đến một nơi lưu trữ tốt hơn
Lie Ryan

4
Tôi thực sự không đồng ý với việc không sử dụng thứ gì đó vì nó có thể không được hỗ trợ. Chúng ta không nên sử dụng bất kỳ tính năng nào khác có thể không được hỗ trợ trên máy chủ? MYSQL vs MYSQLI? Bạn sẽ lãng phí thời gian từng chút một, hết lần này đến lần khác viết các thẻ dài chỉ để tránh một cơ hội nhỏ dành một chút thời gian để thay đổi thành một máy chủ tốt hơn.
Trưởng khoa hoặc

2
@BSeven, Bạn có nghĩa là bạn không sử dụng bất kỳ tiện ích mở rộng PHP nào ngoại trừ các tiện ích mở rộng mặc định?
Pacerier

143

Bắt đầu với PHP 5.4, phím tắt echo là một vấn đề riêng biệt với các thẻ ngắn, vì phím tắt echo sẽ luôn được bật. Bây giờ là sự thật:

Vì vậy, phím tắt echo ( <?=) là an toàn để sử dụng ngay bây giờ.


19
Tôi muốn nói rằng đây là "thẻ ngắn" duy nhất cần thiết. <?phpcó thể được sử dụng khi bắt đầu tất cả các tệp lớp, và sau đó bạn có <?=cho các khung nhìn của mình. đôi bên cùng có lợi
Xeoncross

6
So the echo shortcut itself (<?=) is safe to use... Miễn là bạn cảm thấy thoải mái khi yêu cầu PHP 5.4. Các ứng dụng PHP được phân phối rộng rãi (như wordpress) không cần phải có 5,4 và thậm chí tiếp tục cung cấp hỗ trợ PHP 4 cho đến năm 2011 - 7 năm sau khi PHP 5 được phát hành. Nếu bạn đang ở một nơi như facebook, nơi tất cả các cài đặt phần mềm của bạn được điều hành trực tiếp bởi chính công ty, thì việc yêu cầu hỗ trợ 5.4 sẽ dễ dàng hơn nhiều so với khi bạn làm việc trong một dự án như wordpress.
Nông dân Frank

@dukeofgaming, Wow tốt, không biết rằng bản sửa đổi SVN của họ có thể truy cập được trên web.
Pacerier

82

Vấn đề với toàn bộ cuộc thảo luận này nằm ở việc sử dụng PHP làm ngôn ngữ tạo khuôn mẫu. Không ai tranh cãi rằng các thẻ nên được sử dụng trong các tệp nguồn ứng dụng.

Tuy nhiên, cú pháp có thể nhúng của PHP cho phép nó được sử dụng như một ngôn ngữ mẫu mạnh mẽ và các mẫu phải đơn giản và dễ đọc nhất có thể. Nhiều người đã thấy dễ dàng hơn khi sử dụng một công cụ tạo khuôn mẫu bổ sung chậm hơn nhiều như Smarty, nhưng đối với những người theo chủ nghĩa thuần túy trong số chúng ta, những người yêu cầu kết xuất nhanh và cơ sở mã thuần túy, PHP là cách duy nhất để viết mẫu.

Đối số hợp lệ CHỈ CHỐNG LẠI việc sử dụng các thẻ ngắn là chúng không được hỗ trợ trên tất cả các máy chủ. Nhận xét về xung đột với các tài liệu XML là lố bịch, vì có lẽ bạn không nên trộn lẫn PHP và XML; và nếu là bạn, bạn nên sử dụng PHP để xuất chuỗi văn bản. Bảo mật không bao giờ là vấn đề, bởi vì nếu bạn đặt thông tin nhạy cảm như thông tin truy cập cơ sở dữ liệu bên trong các tệp mẫu, thì bạn đã gặp vấn đề lớn hơn!

Bây giờ, về vấn đề hỗ trợ máy chủ, phải thừa nhận rằng người ta phải nhận thức được nền tảng mục tiêu của họ. Nếu lưu trữ được chia sẻ là một mục tiêu có khả năng, thì nên tránh các thẻ ngắn. Nhưng đối với nhiều nhà phát triển chuyên nghiệp (như bản thân tôi), khách hàng thừa nhận (và thực tế, phụ thuộc vào thực tế) rằng chúng tôi sẽ đưa ra các yêu cầu máy chủ. Thường thì tôi chịu trách nhiệm thiết lập máy chủ.

Và chúng tôi KHÔNG BAO GIỜ làm việc với nhà cung cấp dịch vụ lưu trữ không cho chúng tôi quyền kiểm soát tuyệt đối cấu hình máy chủ - trong trường hợp như vậy, chúng tôi có thể tính đến việc chạy đến nhiều rắc rối hơn là chỉ mất hỗ trợ thẻ ngắn. Nó không xảy ra.

Vì vậy, có - tôi đồng ý rằng việc sử dụng các thẻ ngắn nên được cân nhắc cẩn thận. Nhưng tôi cũng tin chắc rằng nó LUÔN LUÔN là một lựa chọn và nhà phát triển nhận thức được môi trường của mình nên cảm thấy thoải mái khi sử dụng chúng.


6
Nếu, vì một số lý do, bạn đã cài đặt apache để chuyển các tệp .xml sang mod_php, điều <? Xml sẽ gây đau đầu với các thẻ ngắn trên. Nhưng đó rõ ràng là một thiết lập kỳ quái.
Nông dân Frank

3
Một ngôn ngữ tạo khuôn mẫu không thể được nhúng mà không có cách giải quyết trong một số loại tài liệu đầu ra là một thất bại lớn. Lý do duy nhất tôi không nên có một mẫu XML có mã PHP và các thẻ ngắn là vì nó không hoạt động, không phải vì nó không có ý nghĩa.
Vinko Vrsalovic

8
Đây không phải là một "thất bại lớn" để tận dụng lợi ích của PHP như một ngôn ngữ tạo khuôn mẫu nhanh chóng, thuận tiện. Như tôi đã nói trước đây, đó là vấn đề cân nhắc lợi ích và nhược điểm và viết mã theo cách phù hợp với phương pháp bạn đã chọn. Đừng loại bỏ một cách tiếp cận hợp lệ chỉ vì nó không hoạt động trong một kịch bản cụ thể (có thể dễ dàng được thực hiện xung quanh).
Brian Lacy

5
Tôi không loại bỏ bất kỳ cách tiếp cận hợp lệ nào (xem câu trả lời của tôi cho câu hỏi.) Bạn là người loại bỏ PHP một cách phân loại trong XML, tôi trích dẫn: "Dù sao bạn cũng không nên trộn lẫn PHP và XML". Ngoài ra, thất bại lớn mà tôi đã đề cập đến là quyết định sử dụng <?làm thẻ ngắn, vì nó dẫn đến cách giải quyết xấu xí trên XML. Điều đó nói rằng, tôi đồng ý rằng đó là vấn đề cân nhắc lợi ích và nhược điểm, và nếu bạn biết bạn đang làm gì, bạn chắc chắn có thể làm được. Nhưng điều này không phải <?là một lựa chọn tốt.
Vinko Vrsalovic

3
Tôi đến bữa tiệc muộn một chút, nhưng tôi thực sự thích câu trả lời này, và nó phản ánh trải nghiệm của tôi với tình huống này. Mặc dù chúng tôi có một số bất đồng về vấn đề trong văn phòng của mình, tôi có thể nói rằng với công việc hàng ngày gần đây trong php trong nhiều năm, tôi chưa bao giờ gặp phải vấn đề này. Khi PHP được sử dụng để tạo XML, theo kinh nghiệm của tôi, nó luôn nằm trong bối cảnh nội dung rất năng động, điều đó không bao giờ được trực tiếp tạo ra thông qua PHP, vì vậy vấn đề không bao giờ xuất hiện.
redreinard

33

Các thẻ ngắn đang quay trở lại nhờ Zend Framework đẩy " PHP làm ngôn ngữ mẫu " trong cấu hình MVC mặc định của chúng . Tôi không thấy cuộc tranh luận là gì, hầu hết các phần mềm bạn sẽ sản xuất trong suốt cuộc đời sẽ hoạt động trên máy chủ mà bạn hoặc công ty của bạn sẽ kiểm soát. Miễn là bạn giữ cho mình sự nhất quán, không nên có bất kỳ vấn đề nào.

CẬP NHẬT

Sau khi thực hiện khá nhiều công việc với Magento , sử dụng hình thức dài. Kết quả là, tôi đã chuyển sang dạng dài:

<?php and <?php echo

kết thúc

<? and <?=

Có vẻ như một lượng nhỏ công việc để đảm bảo khả năng tương tác.


8
Tôi tự do và tất cả mã của tôi đi vào lưu trữ được chia sẻ, vì vậy không kiểm soát được gì cả! :)
MDCore

12
Nếu bạn có đủ khách hàng chuyển đến sở hữu coloc của bạn, lưu trữ chia sẻ là không an toàn và không ổn định.
Jake McGraw

2
Các thẻ ngắn mà Zend đã mang trở lại dường như không bắt được vì Zend đang sử dụng phiên bản dài: framework.zend.com/manual/en/zend.view.scripts.html
Gerry

3
@Gerry Tôi cũng đã đọc cái này gần đây, xem bình luận cuối cùng về chủ đề này: Cập nhật .htaccess để kích hoạt các thẻ mở ngắn
MrWhite

2
Bạn nên thực sự sửa lỗi ngữ pháp trong câu đầu tiên sau CẬP NHẬT, điều này không có nghĩa gì ở dạng hiện tại của nó.
redreinard

22

Bởi vì sự nhầm lẫn nó có thể tạo ra với các khai báo XML. Nhiều người đồng ý với bạn, mặc dù.

Một mối quan tâm khác là nỗi đau mà nó tạo ra để mã hóa mọi thứ chỉ bằng các thẻ ngắn để tìm ra cuối cùng rằng máy chủ lưu trữ cuối cùng đã tắt chúng ...


Việc khai báo XML có gây nhầm lẫn hay không nếu short_tags được bật?
MDCore

Vì vậy, thay vì trực tiếp xuất ra khai báo XML, bạn có PHP lặp lại nó. Nó không thực sự là một bác bỏ tốt.
moo

Nó không phải là một từ chối của bất cứ điều gì. Đó là lý do thực tế duy nhất đến lượt nó là nguyên nhân cho lý do khác "hoster tắt nó đi", tất nhiên bạn có thể sử dụng nó nếu bạn biết những gì bạn đang làm, như mọi khi.
Vinko Vrsalovic

1
@macek: Tôi biết điều đó. Đó chỉ là ví dụ đầu tiên mà tôi nghĩ đến. Khác, nếu bạn nhúng PHP vào tệp XML thì sao? Bạn không thể làm điều đó trực tiếp. Và đừng nói với tôi giải pháp cho vấn đề đó nữa, tôi biết về họ. Vấn đề là có rất nhiều cách để PHP phân tích một tệp XML. Bạn có thể loại bỏ tất cả chúng bằng cách giải quyết ( <?='<?xml') hoặc bằng cách nói "bạn không nên làm điều đó" nhưng điều đó không làm cho thực tế rằng nó có thể xảy ra biến mất.
Vinko Vrsalovic

1
Làm thế nào là thẻ ngắn là một nỗi đau nếu chúng không hoạt động? nó rất dễ dàng để làm một số lượng lớn và thay thế <?=bằng <? echo . nhiều trình soạn thảo văn bản có thể dễ dàng xử lý việc này với hàng ngàn tệp cùng một lúc.
Yamiko

20

Sau đây là sơ đồ dòng tuyệt vời của cùng:

cây ra quyết định sử dụng <? =

Nguồn: câu hỏi tương tự trên Exchange Engineering Stack Exchange


2
Đây là mô tả có nên sử dụng thẻ echo ngắn hay không, giống như các <?thẻ ngắn được đề cập trong câu hỏi (mặc dù nó sử dụng cùng một cài đặt cấu hình trước 5.4)
Alok

Trên thực tế, đây phải là một câu trả lời mà mọi người đều có thể hiểu, mặc dù các trường hợp không thực sự giải thích lý do tại sao bạn không muốn sử dụng các thẻ ngắn trong nhiều trường hợp (ví dụ: không thể thay đổi tệp php.ini trên hệ thống lưu trữ được chia sẻ)
Bjorn K

14

http://uk3.php.net/manual/en/lingu.basic-syntax.phpmode.php có rất nhiều lời khuyên, bao gồm:

trong khi một số người tìm thấy các thẻ ngắn và thẻ kiểu ASP thuận tiện, chúng ít di động hơn và thường không được khuyến nghị.

lưu ý rằng nếu bạn nhúng PHP trong XML hoặc XHTML, bạn sẽ cần sử dụng các <?php ?>thẻ để duy trì tuân thủ các tiêu chuẩn.

Nên tránh sử dụng các thẻ ngắn khi phát triển các ứng dụng hoặc thư viện nhằm phân phối lại hoặc triển khai trên các máy chủ PHP không thuộc quyền kiểm soát của bạn, vì các thẻ ngắn có thể không được hỗ trợ trên máy chủ đích. Đối với mã di động, có thể phân phối lại, hãy chắc chắn không sử dụng các thẻ ngắn.


14

Trong trường hợp bất cứ ai vẫn chú ý đến điều này ... Kể từ phiên bản PHP 5.4.0 Alpha 1 <?=luôn có sẵn:

http://php.net/release/NEWS_5_4_0_alpha1.txt

Vì vậy, có vẻ như các thẻ ngắn là (a) chấp nhận được và (b) ở đây để ở lại. Ít nhất cho tới hiện tại...


5
<?=không được coi là một thẻ ngắn kể từ ngày 5,4
T0xicCode

12
  • Các thẻ ngắn không được bật theo mặc định trong một số máy chủ web (máy chủ được chia sẻ, v.v.), do đó tính di động của mã trở thành vấn đề nếu bạn cần chuyển sang một trong những máy chủ này.

  • Khả năng đọc có thể là một vấn đề đối với một số. Nhiều nhà phát triển có thể thấy rằng <?phpbắt mắt như một điểm đánh dấu rõ ràng hơn về sự khởi đầu của một khối mã so với <?khi bạn quét một tệp, đặc biệt nếu bạn bị mắc kẹt với một cơ sở mã với HTML và PHP đan xen chặt chẽ.


2
Thẻ ngắn được bật trong 95% máy chủ web.
Paolo Bergantino

19
Tôi không mua đối số "dễ đọc". Nếu bạn đang sử dụng PHP làm ngôn ngữ tạo khuôn mẫu, <?= $var ?>thì dễ đọc hơn nhiều<?php echo $var ?>
Frank Farmer

2
@Paulo điều này có thể đã thay đổi kể từ '08 nhưng các phiên bản Ubuntu và Fedora của EC2 với cài đặt yum và các phiên bản apt-get của PHP đã bị gắn thẻ ngắn bị tắt theo mặc định
Doug Molineux

2
sử dụng thẻ đầy đủ và bạn sẽ có 100% :)
Elvis Ciotti

1
@FrankFarmer, tôi nghĩ anh ấy đang so sánh cái không có tiếng vang. <?vs <?php.
Pacerier

11

Lưu ý: Bắt đầu từ PHP 5.4, thẻ ngắn <?=, hiện luôn có sẵn.


5

Tôi đọc trang này sau khi tìm kiếm thông tin về chủ đề này và tôi cảm thấy rằng một vấn đề lớn chưa được đề cập: sự lười biếng so với tính nhất quán. Các thẻ "thực" cho PHP là <? Php và?>. Tại sao? Tôi không thực sự quan tâm. Tại sao bạn muốn sử dụng cái gì khác khi những thứ đó rõ ràng cho PHP? <% và%> có nghĩa là ASP đối với tôi và <script ..... có nghĩa là Javascript (trong hầu hết các trường hợp). Vậy để thống nhất, học nhanh, tính di động và đơn giản, tại sao không tuân thủ tiêu chuẩn?

Mặt khác, tôi đồng ý rằng các thẻ ngắn trong mẫu (và CHỈ trong mẫu) có vẻ hữu ích, nhưng vấn đề là chúng ta đã dành quá nhiều thời gian để thảo luận về nó ở đây, rằng có thể sẽ mất rất nhiều thời gian để thực sự lãng phí mất nhiều thời gian để gõ thêm ba ký tự của "php" !!

Mặc dù có nhiều tùy chọn là tốt, nhưng nó hoàn toàn không hợp lý và nó có thể gây ra vấn đề. Hãy tưởng tượng nếu mọi ngôn ngữ lập trình cho phép 4 loại thẻ trở lên: Javascript có thể là <JS hoặc <script .... hoặc <% hoặc <? JS .... điều đó có hữu ích không? Trong trường hợp PHP, thứ tự phân tích cú pháp có xu hướng ủng hộ việc cho phép những thứ này, nhưng ngôn ngữ theo nhiều cách khác không linh hoạt: nó đưa ra các thông báo hoặc lỗi khi không nhất quán, nhưng các thẻ ngắn thường được sử dụng. Và khi các thẻ ngắn được sử dụng trên một máy chủ không hỗ trợ chúng, có thể mất một thời gian rất lâu để tìm ra điều gì sai vì không có lỗi nào được đưa ra trong một số trường hợp.

Cuối cùng, tôi không nghĩ rằng các thẻ ngắn là vấn đề ở đây: chỉ có hai loại khối mã PHP hợp lý-- 1) mã PHP thông thường, 2) tiếng vang mẫu. Trước đây, tôi tin chắc rằng chỉ nên cho phép <? Php và?> Chỉ để giữ mọi thứ nhất quán và di động. Đối với phương thức sau, phương thức <? = $ Var?> Thật xấu. Tại sao nó phải như thế này? Tại sao không thêm một cái gì đó hợp lý hơn nhiều? <? php $ var?> Điều đó sẽ không làm gì cả (và chỉ trong những khả năng xa nhất, nó mới có thể xung đột với thứ gì đó) và điều đó có thể dễ dàng thay thế cú pháp <? = Lúng túng. Hoặc nếu đó là một vấn đề, có lẽ họ có thể sử dụng <? Php = $ var?> Thay vào đó và không lo lắng về sự không nhất quán.

Tại thời điểm có 4 tùy chọn cho các thẻ mở và đóng và bổ sung ngẫu nhiên một thẻ "echo" đặc biệt, PHP cũng có thể có cờ "thẻ mở / đóng tùy chỉnh" trong php.ini hoặc .htaccess. Bằng cách đó các nhà thiết kế có thể chọn một trong những họ thích nhất. Nhưng vì lý do rõ ràng đó là quá mức cần thiết. Vậy tại sao cho phép 4+ tùy chọn?


4

Thật tốt khi sử dụng chúng khi bạn làm việc với khung MVC hoặc CMS có các tệp xem riêng biệt.
Nó nhanh, ít mã, không gây nhầm lẫn cho các nhà thiết kế. Chỉ cần đảm bảo cấu hình máy chủ của bạn cho phép sử dụng chúng.


4

Một tình huống hơi khác một chút là khi phát triển ứng dụng CodeIgniter . CodeIgniter dường như sử dụng các shorttags bất cứ khi nào PHP đang được sử dụng trong một khuôn mẫu / khung nhìn, nếu không, với các mô hình và bộ điều khiển, nó luôn sử dụng các thẻ dài. Đó không phải là một quy tắc cứng và nhanh trong khung, nhưng đối với hầu hết các khung và rất nhiều nguồn từ các mục đích sử dụng khác tuân theo quy ước này.

Theo quan điểm của tôi? Nếu bạn không bao giờ có kế hoạch chạy mã ở một nơi khác, thì hãy sử dụng chúng nếu bạn muốn. Tôi thà không phải thực hiện một tìm kiếm lớn và thay thế khi tôi nhận ra đó là một ý tưởng ngu ngốc.



3

Những người IMHO sử dụng các thẻ ngắn thường quên thoát bất cứ điều gì họ đang lặp lại. Nó sẽ là tốt đẹp để có một công cụ mẫu thoát theo mặc định. Tôi tin rằng Rob A đã viết một bản hack nhanh để thoát các thẻ ngắn trong ứng dụng Zend Frameworks. Nếu bạn thích các thẻ ngắn vì nó làm cho PHP dễ đọc hơn. Vậy thì Smarty có thể là một lựa chọn tốt hơn?

{$myString|escape}

với tôi điều đó có vẻ tốt hơn

<?= htmlspecialchars($myString) ?> 

10
Đối với hầu hết các lập trình viên PHP, tùy chọn thứ hai có ý nghĩa hơn so với đầu tiên, đơn giản vì đây là một hàm PHP thực tế mà chúng ta quen thuộc, trong khi tùy chọn đầu tiên là mã giả định mà chúng ta phải tìm hiểu trên PHP. PHP đã là một ngôn ngữ tạo khuôn mẫu, thêm một ngôn ngữ tạo khuôn mẫu khác lên trên nó như Smarty là IMO dư thừa.
Bug Magnet

3
Twig là một công cụ mẫu với thoát html được bật theo mặc định twig.sensiolabs.org
mateusza

3

Người ta phải hỏi quan điểm của việc sử dụng các thẻ ngắn là gì.

Gõ nhanh hơn

MDCore cho biết:

<?= thuận tiện hơn nhiều so với gõ <?php echo

Vâng, đúng vậy. Bạn tiết kiệm phải nhập 7 ký tự * X lần trong toàn bộ tập lệnh của mình.

Tuy nhiên, khi một kịch bản mất một giờ, hoặc 10 giờ hoặc hơn, để thiết kế, phát triển và viết, thì vài giây thời gian không gõ 7 ký tự đó ở đây và trong thời gian của kịch bản là gì?

So với tiềm năng cho một số lõi hoặc tất cả các tập lệnh của bạn không hoạt động nếu các thẻ ngắn không được bật hoặc đang bật nhưng một bản cập nhật hoặc ai đó thay đổi cấu hình tệp / máy chủ ini sẽ ngăn chúng hoạt động, các tiềm năng khác.

Lợi ích nhỏ mà bạn có được không đến gần như vượt quá mức độ nghiêm trọng của các vấn đề tiềm ẩn, đó là trang web của bạn không hoạt động hoặc tệ hơn, chỉ một phần của nó không hoạt động và do đó phải đau đầu để giải quyết.

Dễ đọc hơn

Điều này phụ thuộc vào sự quen thuộc .
Tôi đã luôn luôn nhìn thấy và sử dụng <?php echo. Vì vậy, trong khi <?=không khó đọc, nó không quen thuộc với tôi và do đó không dễ đọc hơn .

Và với sự phân chia của nhà phát triển front end / back end (như với hầu hết các công ty), một nhà phát triển front end làm việc trên các mẫu đó có quen biết hơn <?=bằng với "thẻ mở và tiếng vang PHP" không?
Tôi có thể nói hầu hết sẽ thoải mái hơn với cái hợp lý hơn. Đó là, một thẻ mở PHP rõ ràng và sau đó những gì đang xảy ra "echo" - <?php echo.


Vấn đề đánh giá rủi ro = toàn bộ trang web hoặc tập lệnh cốt lõi không hoạt động;

Tiềm năng của vấn đề là rất thấp + mức độ nghiêm trọng của kết quả là rất cao = rủi ro cao

Phần kết luận

Bạn tiết kiệm một vài giây ở đây và không phải gõ một vài ký tự, nhưng rủi ro rất nhiều cho nó, và cũng có khả năng mất khả năng đọc do kết quả.

Mặt trận hoặc back-end lập trình quen thuộc với <?=rất nhiều khả năng để hiểu <?php echo, vì họ PHP chuẩn đang điều - Tiêu chuẩn <?phpthẻ mở và rất nổi tiếng "echo".
(Ngay cả các lập trình viên giao diện người dùng cũng nên biết "echo" hoặc đơn giản là họ sẽ không làm việc với bất kỳ mã nào được cung cấp bởi một khung công tác).

Trong khi điều ngược lại là không có khả năng, một người nào đó không có khả năng suy luận một cách hợp lý rằng dấu bằng trên thẻ ngắn PHP là "echo".


Nó không có gì để làm với gõ. Nó ngắn hơn và do đó có khả năng dễ đọc hơn . Một người đã từng đọc <?=sẽ đọc <?=dễ dàng hơn một người đã từng đọc <?php echođọc <?php echo.
Pacerier

@Pacerier Shorter không đơn giản = dễ đọc hơn. Chúng ta đều khác nhau. Ý bạn là, nó dễ đọc hơn đối với bạn . Khi tôi trả lời, vì tôi đã từng <?phpthấy rằng mã trong suốt nhiều lần quen thuộc với tôi hơn <?=- quen thuộc làm cho mọi thứ dễ dàng hơn - tho không nhất thiết phải tốt hơn.
James

Không, tôi không so sánh bạn và tôi, tôi đang nói một người đã từng đọc <?=sẽ đọc <?=tốt hơn một người đã từng đọc <?php echođọc <?php echo. Điều đó có nghĩa là nếu chúng ta có hai bản sao giống hệt người X và chỉ thay đổi chúng ở khía cạnh mà một người thường đọc <?=và người kia thường đọc <?php echo, Bản sao đầu tiên có thể đạt được giá trị dễ đọc xtrong khi đọc bằng cú pháp mong muốn của anh ta, trong khi bản sao thứ hai có thể đạt được giá trị dễ đọc ykhi đọc cú pháp mong muốn của mình, ở đâu x >= y.
Pacerier

Không có bạn thiếu điểm. Tôi đang đề cập đến tiềm năng của hệ thống, không liên quan gì đến bất kỳ người cụ thể nào. Bạn có thể nói những người thường gõ bằng bàn phím qwerty sẽ gõ nhanh hơn bằng qwerty, trong khi những người thường gõ bằng dvorak sẽ gõ nhanh hơn với dvorak, nhưng thực tế không thay đổi rằng hai hệ thống có tiềm năng khác nhau.
Pacerier

3

Hãy đối mặt với nó. PHP xấu như địa ngục mà không có thẻ ngắn.

Bạn có thể kích hoạt chúng trong một .htaccesstệp nếu bạn không thể truy cập vào php.ini:

php_flag short_open_tag on

3
Sai. Đôi khi, máy chủ được thiết lập để từ chối bất kỳ loại ghi đè nào, thưa ông.
Alfabravo

17
Đúng, nhưng nếu máy chủ của bạn không cho phép bạn ghi đè bằng htaccess, bạn thực sự cần một máy chủ mới! :)
Brian Lacy

1
không hoạt động trên giao diện dòng lệnh và php_flag không được hỗ trợ mọi lúc
Elvis Ciotti

3

Để tránh các vấn đề về tính di động, hãy khởi động các thẻ PHP bằng <?phpvà trong trường hợp tệp PHP của bạn hoàn toàn là PHP, không có HTML, bạn không cần phải sử dụng các thẻ đóng.


2
  • Thẻ ngắn được chấp nhận để sử dụng trong trường hợp bạn chắc chắn máy chủ sẽ hỗ trợ và nhà phát triển của bạn sẽ hiểu nó.
  • Nhiều máy chủ không hỗ trợ nó và nhiều nhà phát triển sẽ hiểu nó sau khi nhìn thấy nó một lần.
  • Tôi sử dụng thẻ đầy đủ để đảm bảo tính di động, vì nó thực sự không tệ.

Như đã nói, một người bạn của tôi đã nói điều này, để hỗ trợ các thẻ kiểu asp tiêu chuẩn thay thế , <%thay vì <?, đó là một cài đặt trong php.ini có tên là asp_tags. Đây là lý do của mình:

... các quy ước tùy ý nên được tiêu chuẩn hóa . Đó là, bất cứ khi nào chúng ta phải đối mặt với một tập hợp các khả năng có giá trị như nhau - chẳng hạn như dấu chấm câu kỳ lạ mà ngôn ngữ lập trình của chúng ta nên sử dụng để phân định chính nó - chúng ta nên chọn một cách chuẩn và tuân theo nó. Bằng cách đó, chúng tôi giảm thời gian học tập của tất cả các ngôn ngữ (hoặc bất cứ điều gì mà quy ước liên quan đến).

Nghe có vẻ tốt với tôi, nhưng tôi không nghĩ bất kỳ ai trong chúng ta có thể khoanh tròn các toa xe xung quanh nguyên nhân này. Trong khi đó, tôi sẽ gắn bó với đầy đủ <?php.


2

Tôi nghĩ rằng nó đáng để đề cập đến như của PHP 7:

  • Các thẻ PHP PHP ngắn <% … %>đã biến mất
  • Các tab PHP ngắn <? … ?>vẫn có sẵn nếu short_open_tagđược đặt thành đúng. Đây là mặc định.
  • Kể từ PHP 5.4, Ngắn In thẻ <?=… ?>được luôn luôn được kích hoạt, không phụ thuộc vào short_open_tagthiết lập.

Tốt cho người đầu tiên, vì nó can thiệp vào các ngôn ngữ khác.

Bây giờ không có lý do gì để không sử dụng các thẻ in ngắn, ngoài sở thích cá nhân.

Tất nhiên, nếu bạn đang viết mã để tương thích với các phiên bản cũ của PHP 5, bạn sẽ cần tuân theo các quy tắc cũ, nhưng hãy nhớ rằng mọi thứ trước khi PHP 5.6 hiện không được hỗ trợ.

Xem: https://secure.php.net/manual/en/lingu.basic-syntax.phptags.php


1
Trừ khi tôi nhầm, điểm đầu tiên của bạn là không chính xác. Tài liệu nói rằng các thẻ ASP, không phải các thẻ PHP ngắn, đã biến mất kể từ phiên bản PHP 7.0.0.
cải cách

@reformed Bạn hoàn toàn chính xác. Tôi sẽ chỉnh sửa câu trả lời của tôi. Cảm ơn
Manngo

1

Nếu bạn quan tâm đến XSS thì bạn nên sử dụng <?= htmlspecialchars(…) ?>hầu hết thời gian, vì vậy một thẻ ngắn không tạo ra sự khác biệt lớn.

Thậm chí nếu bạn rút ngắn echo htmlspecialchars()tới h(), nó vẫn còn là một vấn đề mà bạn cần phải nhớ để thêm nó hầu hết thời gian (và cố gắng để theo dõi mà dữ liệu được pre-thoát, đó là unescaped-nhưng-vô hại chỉ làm cho sai lầm nhiều khả năng).

Tôi sử dụng một công cụ tạo khuôn mẫu được bảo mật theo mặc định và viết <?phpcác thẻ cho tôi.


7
Nếu bạn thấy mình đang gõ "<? Php echo htmlspecialchars ($ text, ENT_QUOTES, 'UTF-8');?> 500 lần một ngày, bạn có thể muốn tạo một chức năng phím tắt có tên" h "như Rails có .." < ? = h ($ text)?> "chỉ dễ đọc hơn nhiều khi quét mẫu.
Alexander Malfait

1
Thực sự tốt hơn, nhưng với một công cụ mẫu, nó có thể chỉ đơn giản là $ {text} hoặc tương tự (và bạn không phải nhớ thêm h ())
Kornel

7
Bản thân PHP là một công cụ tạo khuôn mẫu. Khi bạn ngừng sử dụng các thẻ ngắn, nó bắt đầu trở thành công cụ tạo khuôn mẫu xấu vì nó trở nên quá dài dòng.
Josef Sábl

1
@Alexander Malfait đó là một mẹo hay. Nhưng <? = Không cần thiết. Bạn chỉ có thể làm cho hàm lặp lại chuỗi thay vì trả về, vì vậy sau đó bạn sẽ viết <? Php h ('xin chào')?> Chúng ta đã làm điều đó khi chúng ta de i18n chưa? <? php _e ('')?> không tệ lắm.
VladFr

1

<?php ?>sẽ tốt hơn nhiều khi sử dụng vì các nhà phát triển ngôn ngữ lập trình này đã cập nhật ồ ạt ngôn ngữ cốt lõi của họ. Bạn có thể thấy sự khác biệt giữa các thẻ ngắn và thẻ dài.

Các thẻ ngắn sẽ được tô sáng màu đỏ nhạt trong khi các thẻ dài hơn được tô đậm hơn!

Tuy nhiên, lặp lại một cái gì đó ra, ví dụ: <?=$variable;?>là tốt. Nhưng thích các thẻ dài hơn.<?php echo $variable;?>


1

Chuyển đổi <?(không có dấu cách) sang <?php(có dấu cách):

find . -name "*.php" -print0 | xargs -0 perl -pi -e 's/<\?(?!php|=|xml|mso| )/<\?php /g'

Chuyển đổi <?(với một không gian dấu) thành <?php(giữ lại không gian dấu):

find . -name "*.php" -print0 | xargs -0 perl -pi -e 's/<\? /<\?php /g'

1

Thẻ ngắn là những con đường có sẵn trong php. Vì vậy, bạn không cần lặp lại câu lệnh đầu tiên trong tập lệnh của mình

thí dụ:

    $a =10;
    <?= $a;//10 
    echo "Hellow";//
    echo "Hellow";

   ?>

Đột nhiên bạn cần sử dụng cho một tập lệnh php sau đó bạn có thể sử dụng nó. thí dụ:

<html>
<head>
<title></title>
</head>  
<body>
<p>hellow everybody<?= hi;?></p>
<p>hellow everybody  </p> 
<p>hellow everybody  </p>   
</body>
</html>

1

Kể từ năm 2019 tôi không đồng ý với câu trả lời nhất định ở đây. Tôi khuyên bạn nên sử dụng thẻ dài

<?php /* code goes here */ ?>

hoặc thẻ echo ngắn

<?= /* code goes here */ ?>

Lý do: Chúng được khuyến nghị theo tiêu chuẩn mã hóa cơ bản PSR-1

Các thẻ ngắn khác như <? /* code goes here */ ?>không được khuyến khích.

Thông số kỹ thuật nói:

Mã PHP PHẢI sử dụng các thẻ dài hoặc các thẻ echo ngắn; nó KHÔNG PHẢI sử dụng các biến thể thẻ khác .


1

3 thẻ có sẵn trong php:

  1. thẻ dạng dài mà <?php ?>không cần chỉ thị bất kỳ cấu hình nào
  2. short_open_tag <? ?> khả dụng nếu tùy chọn short_open_tag trong php.ini được bật
  3. rút ngắn thẻ <?= kể từ php 5.4.0, nó luôn có sẵn

từ php 7.0.0 asp và thẻ script được xóa


Điều đó không trả lời câu hỏi.
RalfFriedl

-5

Không, và chúng đang bị loại bỏ bởi PHP 6 vì vậy nếu bạn đánh giá cao tuổi thọ của mã, chỉ cần không sử dụng chúng hoặc các <% ... %>thẻ.


4
Tôi đã thấy các bài đăng trên blog khác nói rằng chúng sẽ không bị phản đối, chỉ là các thẻ ngắn theo phong cách ASP.
MDCore

22
Có vẻ như câu trả lời này không chính xác, theo liên kết này từ cuộc họp của Nhà phát triển PHP: php.net/~derick/ mẹo
Charles

7
TẠI SAO họ rất tệ, tại sao? Mọi người đều tự tin rằng họ là baaaaaad nhưng không ai nói lý do tại sao.
Josef Sábl

6
SAI. Họ đang loại bỏ các thẻ <%%>, như thực tế họ nên làm. Họ phục vụ không có mục đích nhưng để gây nhầm lẫn. Cái <? ?> thẻ sẽ không bị ảnh hưởng; nhưng tất nhiên chúng vẫn có thể được cấu hình trên cơ sở mỗi máy chủ và bạn phải luôn nhận thức được các yêu cầu của nền tảng mục tiêu của mình.
Brian Lacy

6
Thông tin này dường như không chính xác và sai lệch, và nó cần được sửa bởi tác giả.
tex
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.