2010-04-08 34 views
10

Đây có phải là phương pháp hay hay cách sử dụng sai số của PHP?

if (isset($_REQUEST['id']) && $_REQUEST['id'] == 6) { 
    echo 'hi'; 
} 

if (@$_REQUEST['id'] == 6) { 
    echo 'hi'; 
} 

EDIT:
Tôi cũng nghĩ vậy. Mã (và ý tưởng) là từ bạn bè.
Cảm ơn bạn đã chứng minh cho tôi đúng. :)

+1

EDIT: Đã thêm dấu ngoặc đơn đóng vào lệnh 'isset()'. –

Trả lời

12

Thực tế không tốt để sử dụng tính năng chặn lỗi. Nó thậm chí không phải là một thực hành tốt để sử dụng $ _REQUEST cả. Chỉ cần sử dụng isset() hoặc! Empty() hoặc bất cứ điều gì, không được lười biếng.

Và một điều nữa, đó là một "thực hành tốt" để đóng ngoặc khi sử dụng isset() :)

+1

Bạn cũng có thể sử dụng 'array_key_exists' để kiểm tra xem biến có được gửi bởi trình duyệt –

+0

yeah, đó là lý do tôi thêm" hoặc bất kỳ thứ gì ":) – Kemo

+1

Tôi đã bỏ phiếu này, nhưng để hoàn thành, bạn có thể thêm một số giải thích cho OP về lý do. – Gordon

2

tôi luôn sử dụng isset() vì nó cụ thể hơn. Ngoài ra, tôi sẽ sử dụng biến superglobal cụ thể hơn, vì vậy hãy sử dụng $ _POST, $ _GET, $ _SESSION. Là rõ ràng với mã của bạn tránh đau đầu sau này :)

này là làm thế nào tôi chạy kiểm tra của tôi:

if(isset($_POST['id']) && $_POST['id'] == '6') 
{ 
    // do stuff 
} 

Đây là kiểm tra khá kỹ lưỡng, vì nó kiểm tra cho một sự tồn tại của một bưu điện, sau đó cho dù biến của tôi là một phần của bài đăng và cuối cùng nếu hai người đó vượt qua, nó sẽ kiểm tra xem biến của tôi có bằng 6.

+2

Kiểm tra boolean ban đầu cho '$ _POST' là không cần thiết. Ngoài ra, sử dụng 'isset' được ưu tiên sử dụng' array_key_exists', nhanh hơn nhiều lần. Ưu điểm duy nhất là nếu bạn muốn kiểm tra xem 'id' có tồn tại hay không. – ryeguy

+0

@ryeguy cảm ơn lời khuyên! :) suy nghĩ về nó ngay bây giờ yeah của nó một chút ngớ ngẩn kể từ array_key_exists iterates qua mảng không? – studioromeo

+0

Ban đầu tôi cũng nghĩ điều này, nhưng điều đó không đúng. Nếu bạn benchmark 'array_key_exists' bạn sẽ nhận ra nó là' O (1) ', giống như' isset'. Tôi nghĩ rằng 'isset' là nhanh hơn đơn giản chỉ vì nó là một ngôn ngữ xây dựng, do đó, không có chức năng gọi trên cao như có' array_key_exists'. – ryeguy

3

Không, nó không phải là thực sự là một thực tế có thể chấp nhận theo ý kiến ​​của tôi. Ngoài thực tế là nó trông cẩu thả, trình xử lý lỗi tùy chỉnh vẫn được kích hoạt ngay cả khi sử dụng triệt tiêu lỗi.

Các manual cung cấp thêm lý do để tránh việc sử dụng nó hoàn toàn:

Hiện nay "@" lỗi kiểm soát điều hành tiền tố sẽ thậm chí vô hiệu báo cáo cho các lỗi quan trọng là sẽ chấm dứt thực hiện kịch bản lỗi. Trong số những thứ khác, điều này có nghĩa là nếu bạn sử dụng "@" để ngăn chặn lỗi từ một chức năng nhất định và không có sẵn hoặc đã bị nhập sai, tập lệnh sẽ chết ngay tại đó mà không có chỉ dẫn nào về lý do.

16

Ngăn chặn lỗi bằng cách sử dụng @ chỉ ngăn hiển thị lỗi, chứ không phải việc tạo lỗi. Vì vậy, bạn nhận được một hiệu suất nhỏ hit từ lỗi nếu bạn không kiểm tra isset() đầu tiên.

+0

Đây là câu trả lời đúng nhất –

1

Ngoài việc không thực hành tốt, vì @ có thể nhai các lỗi thực sự quan trọng trong ngăn xếp cuộc gọi, hình phạt hiệu suất là nhỏ.

Hãy xác minh điều này với điểm chuẩn.

<?php 
error_reporting(-1); 

$limit = 10000; 

$start = microtime(true); 
for ($i = 0; $i < 10000; $i++) { 
    echo !isset($_GET['aaa']) ? '' : $_GET['aaa']; 
} 
$total = 1000000 * (microtime(true) - $start)/$limit; 
echo "With isset: $total μs\n"; 

$start = microtime(true); 
for ($i = 0; $i < 10000; $i++) { 
    echo @$_GET['aaa']; 
} 
$total = 1000000 * (microtime(true) - $start)/$limit; 
echo "With @: $total μs\n"; 

Trên máy tính không quá gần đây của tôi nó ra:

With isset: 0.295 μs 
With @: 0.657 μs 

ms là một phần triệu của một giây. Cả hai phương pháp đều mất gần một nửa phần triệu giây.

Người ta có thể nói, nhưng nếu tôi làm điều này cho hàng trăm hoặc hàng ngàn lần, sẽ có sự khác biệt nào không? Nếu bạn phải làm !isset() một triệu lần, thì chương trình của bạn đã dành khoảng 0,3 giây để làm điều này! Có nghĩa là bạn không nên làm điều đó ngay từ đầu.

Tuy nhiên, @ là một thực hành không tốt cho bất kỳ điều gì phức tạp hơn một mảng đơn giản, do đó không sử dụng nó ngay cả khi bạn biết rằng sự khác biệt hiệu suất là không đáng kể.