2013-04-12 25 views
6

Có cách nào ngắn gọn để kiểm tra xem một biến được đặt hay không và sau đó lặp lại nó mà không lặp lại cùng tên biến?Kiểm tra xem biến có được đặt hay không và lặp lại nó mà không lặp lại?

Thay vì điều này:

<?php 
    if(!empty($this->variable)) { 
     echo '<a href="', $this->variable, '">Link</a>'; 
    } 
?> 

Tôi đang suy nghĩ về điều gì đó trong dòng C-phong cách này giả:

<?php 
    echo if(!empty($this->variable, '<a href="', %s, '">Link</a>')); 
?> 

PHP có sprintf, nhưng nó không hoàn toàn làm những gì Tôi đã hy vọng. Nếu khóa học tôi có thể làm cho một phương pháp/chức năng ra khỏi nó, nhưng chắc chắn phải có một cách để làm điều đó "nguyên bản"?

Cập nhật: Hoạt động ba năm cũng sẽ lặp lại phần $this->variable, nếu tôi hiểu nó?

echo (!empty($this->variable) ? '<a href="',$this->variable,'">Link</a> : "nothing"); 
+0

Tôi không biết về bất kỳ tốc ký cho điều đó. Nếu bạn sử dụng nó rất nhiều, tôi sẽ đề nghị tạo một hàm cho nó. – str

+0

Phép toán ba năm ('(bool)? Giá trị: mặc định') không phải là một tùy chọn? – BlitZ

Trả lời

0

Sử dụng isset chức năng của php như thế này:

<?php 

    echo $result = isset($this->variable) ? $this->variable : "variable not set"; 

?> 

tôi nghĩ rằng điều này sẽ giúp.

+0

Biến '$ this- >' sẽ vẫn lặp lại trong phần" làm điều gì đó ". Tôi muốn làm điều đó mà không lặp lại nó nhiều lần trong lệnh. (downvote không phải của tôi ...) –

+0

tôi đã chỉnh sửa câu trả lời của mình, hãy kiểm tra ngay bây giờ. – saveATcode

13

Gần nhất bạn có thể nhận được những gì bạn đang tìm kiếm đang sử dụng hình thức ngắn của nhà điều hành ternary (có sẵn từ PHP5.3)

echo $a ?: "not set"; // will print $a if $a evaluates to `true` or "not set" if not 

Nhưng điều này sẽ kích hoạt "biến Không xác định" thông báo. Mà bạn rõ ràng có thể ngăn chặn với @

echo @$a ?: "not set"; 

Vẫn không phải là giải pháp thanh lịch/sạch sẽ nhất.

Vì vậy, mã sạch nhất bạn có thể hy vọng là

echo isset($a) ? $a: ''; 
+1

Thường thì tôi sẽ sử dụng một kỹ thuật tương tự như thế này nhưng với sản phẩm nào cũng có tài khoản cho các chuỗi trống – christian

+0

Suy nghĩ tốt. Xấu hổ không có một chức năng PHP sẵn có và đáng ngạc nhiên quá. –

10

Cập nhật:

PHP 7 giới thiệu một tính năng mới: Null coalescing operator

Dưới đây là ví dụ từ php.net.

<?php 
// Fetches the value of $_GET['user'] and returns 'nobody' 
// if it does not exist. 
$username = $_GET['user'] ?? 'nobody'; 
// This is equivalent to: 
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; 

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
?> 

Đối với những người không sử dụng PHP7 chưa đây là câu trả lời ban đầu của tôi ...

tôi sử dụng một chức năng nhỏ để đạt được điều này:

function ifset(&$var, $else = '') { 
    return isset($var) && $var ? $var : $else; 
} 

Ví dụ:

$a = 'potato'; 

echo ifset($a);   // outputs 'potato' 
echo ifset($a, 'carrot'); // outputs 'potato' 
echo ifset($b);   // outputs nothing 
echo ifset($b, 'carrot'); // outputs 'carrot' 

Caveat: Như Inigo chỉ ra trong một bình luận dưới đây một tác dụng phụ không mong muốn của việc sử dụng chức năng này là nó có thể sửa đổi đối tượng/mảng mà bạn đang kiểm tra.Ví dụ:

$fruits = new stdClass; 
$fruits->lemon = 'sour'; 
echo ifset($fruits->peach); 
var_dump($fruits); 

Will đầu ra:

(object) array(
    'lemon' => 'sour', 
    'peach' => NULL, 
) 
+1

Tôi cũng nghĩ về điều này. Tuy nhiên, vấn đề sau đây phát sinh: $ data = []; $ data ['a'] = 2; echo ifset ($ data ['b']); var_dump ($ data); Sẽ trả về mảng (2) {["a"] => int (2) ["b"] => NULL}. Vì vậy, chức năng ifset thực sự sửa đổi đối tượng dữ liệu gốc ... – Inigo

+1

Bạn hoàn toàn đúng Inigo - Tôi chưa bao giờ nhận ra rằng không thường sử dụng điều này với mảng. Có vẻ như chúng ta sẽ phải đợi đến khi chúng ta đang sử dụng PHP7 cho một giải pháp chắc chắn không sửa đổi đối tượng gốc. –

Các vấn đề liên quan