2010-09-17 14 views
17

Về cơ bản, tôi muốn có thể xác định biến là một thứ trừ khi điều đó không tồn tại. Tôi thề rằng ở đâu đó tôi thấy một điều kiện viết tắt mà nhìn một cái gì đó như thế này:Thuật ngữ có điều kiện để xác định một biến dựa trên sự tồn tại của một biến khác trong PHP

$var=$_GET["var"] || "default"; 

Nhưng tôi không thể tìm thấy bất kỳ tài liệu hướng dẫn để làm điều này đúng, và trung thực nó có thể đã JS hay ASP hay cái gì đó mà tôi thấy nó .

Tôi hiểu rằng tất cả những gì sẽ xảy ra trong mã trên chỉ là để kiểm tra xem một trong hai câu lệnh có trả về true hay không. Nhưng tôi nghĩ tôi thấy ai đó làm điều gì đó về cơ bản đã định nghĩa mặc định nếu lần đầu tiên thất bại. Đây có phải là điều gì đó mà ai cũng biết và có thể giúp tôi không? Tôi có điên không? Nó chỉ có vẻ dư thừa để nói:

$var=($_GET["var"]) ? $_GET["var"] : "default"; 

hoặc đặc biệt là dư thừa để nói:

if ($_GET["var"]) { $var=$_GET["var"]; } else { $var="default"; } 

Suy nghĩ?

+0

Có php ngu ngốc không thể làm điều này, bất cứ ai biết nếu nó có thể làm điều này là 5,6? –

+1

@DominicTobias Câu trả lời được chấp nhận hoạt động trong 5.3+ –

+0

Bản sao có thể có của [Đặt giá trị mặc định (gán có điều kiện)] (http://stackoverflow.com/questions/163092/setting-default-values-conditional-assignment) –

Trả lời

14

Matthew đã đề cập đến cách duy nhất để làm điều đó trong PHP 5.3. Lưu ý rằng bạn cũng có thể chuỗi chúng:

$a = false ?: false ?: 'A'; // 'A' 

Đây không phải là giống như:

$a = false || false || 'A'; // true 

Lý do tại sao là PHP cũng giống như hầu hết các ngôn ngữ truyền thống trong lĩnh vực này. Hợp lý HOẶC luôn trả về true hoặc false. Tuy nhiên, trong JavaScript, biểu thức cuối cùng được sử dụng. (Trong một loạt các OR, nó sẽ là số không giả đầu tiên.)

var a = false || 'A' || false; // 'A' 
var b = true && 'A' && 'B'; // 'B'; 
+0

Matthew khác đã loại bỏ câu trả lời của mình bởi vì anh không thích câu trả lời đó không tuân theo các phương pháp hay nhất cá nhân của mình, vì vậy anh đã xóa nó đi. Vì vậy, tôi đánh dấu điều này là chính xác vì nó mở rộng trên câu trả lời gốc. Để ghi lại, những lo ngại khác của Matthew được thể hiện trong câu trả lời của Fanis. Họ là những mối quan tâm hợp lệ, nhưng câu trả lời cho câu hỏi của tôi là trong thực tế '?:', Như được hiển thị ở đây. –

7

Trong trường hợp này, bạn nên kiểm tra sự tồn tại của biến trong $ _GET và sau đó liệu biến đó có hợp lệ cho thông số của bạn hay không. Ví dụ:

$var = (isset($_GET["var"]) && $_GET['var'] !== '') ? $_GET["var"] : "default"; 

Tuy nhiên, điều này có thể trở nên khá khó đọc khá nhanh. Tôi muốn nói giữ cho nó có thể đọc được bằng cách đầu tiên khởi tạo biến của bạn để mặc định an toàn, và sau đó ghi đè lên rằng với một ai bên ngoài, nếu đó là hợp lệ:

$var = "default"; 
if (isset($_GET['var') && $_GET['var'] !== '') { 
    $var = $_GET['var] ; 
} 

Đối với ví dụ đầu tiên của bạn, $var=$_GET["var"] || "default"; tồn tại trong Javascript: var someVar = incomingVar || "default";

+0

@Ben, điều này có lẽ là câu trả lời được chấp nhận. Nó dài hơn một chút, nhưng nó tránh được cảnh báo. Ngoài ra, kiểm tra chống lại! == '' không thực sự tồn tại, mặc dù nó có thể hữu ích cho một số trường hợp. –

+0

@MatthewFlaschen Điều này không thực sự trả lời câu hỏi tôi đã mặc dù. Nó làm tăng mối quan tâm hợp lệ, vì vậy tôi đã upvoted nó. Nhưng câu hỏi là nếu có một cách để hoàn thành những gì bạn đã làm, viết tắt. –

2

Tôi luôn sử dụng sản phẩm nào.

$var = !empty($_GET['var'])?$_GET['var']:'default'; 
+0

Tôi cho rằng nếu bạn đang sử dụng $ _GET, bạn sẽ không bao giờ nhận được một phản hồi boolean vì vậy 'empty' không thể phân biệt được với' isset', nhưng điều này có vẻ như là một cách tồi tệ hơn để làm điều đó trong các tình huống khác: '$ var =! Empty ($ other_var)? $ other_var: true' sẽ làm cho $ var * luôn luôn * bằng true. Mặc dù, tôi đoán, như vậy sẽ ký hiệu JS 'var = other_var || đúng'. –