2011-09-05 25 views
10

Tại sao isset() không hoạt động khi tên thuộc tính có trong biến?isset() với tên thuộc tính động

$Object = new stdClass(); 
$Object->tst = array('one' => 1, 'two' => 2); 

$tst = 'tst'; $one = 'one'; 
var_dump($Object, isset($Object->tst['one']), isset($Object->$tst[ $one ])); 

kết quả đầu ra như sau:

object(stdClass)#39 (1) { 
    ["tst"]=> 
    array(2) { 
    ["one"]=> 
    int(1) 
    ["two"]=> 
    int(2) 
    } 
} 
bool(true) 
bool(false) // was expecting true here.. 

Edit: tiếp tục đùa giỡn xung quanh với mã này, và phát hiện ra rằng

var_dump($Object->$tst['one']); 

kết quả đầu ra một Thông Báo:

E_NOTICE: Undefined property: stdClass::$t 

Vì vậy, tôi nghĩ rằng vấn đề là phần $tst[...] được đánh giá trong 'chế độ chuỗi' (đánh giá đến ký tự đầu tiên trong chuỗi; trong trường hợp này là "t"), trước khi đi tìm nạp thuộc tính từ đối tượng;

var_dump($tst, $tst['one']); // string(3) "tst" string(1) "t" 

Giải pháp: là đặt niềng răng xung quanh tên biến ($this->{$tst}), nói với người phiên dịch để lấy giá trị của nó đầu tiên, và sau đó đánh giá [...] phần:

var_dump($Object->{$tst}['one']); // int(1) yay! 
+2

Y u làm những điều tàn nhẫn như vậy với người nghèo 'isset() '? Nó đã làm gì cho bạn? (Nghiêm túc đấy, câu hỏi hay, tôi bị bối rối!) –

+0

Hiển thị 'var_dump ($ Object -> $ tst)' là gì? – CodeCaster

+3

Vấn đề chỉ là ưu tiên vận hành ở đây. '[]' trên '->' do biến là tên thuộc tính. – mario

Trả lời

9

Thử thêm dấu ngoặc ôm xung quanh tên thuộc tính ...

isset($Object->{$tst}[ $one ]); 

CodePad.

+0

Nó hoạt động! Bạn là một anh hùng. Chăm sóc để giải thích chính xác những gì đang xảy ra ở đây? :) – Rijk

+0

@Rijk Chỉ cần tự tìm ra. Linh cảm của tôi là toán tử ưu tiên, mặc dù PHP [không định nghĩa] (http://php.net/manual/en/language.operators.precedence.php) ưu tiên cho '->' (mặc dù nó xác định chỉ số mảng '[' toán tử). – alex

+0

'var_dump ($ Object -> $ tst ['one']);' output 'E_NOTICE: Thuộc tính không xác định: stdClass :: $ t' .. Có lẽ phần' $ tst [...] 'đang được đánh giá 'là chuỗi 'đầu tiên? – Rijk

0

trả lời câu hỏi của riêng tôi :)

Went trên toying xung quanh với mã này, và phát hiện ra rằng

var_dump($Object->$tst['one']); 

kết quả đầu ra một Thông Báo:

E_NOTICE: Undefined property: stdClass::$t 

Vì vậy, tôi nghĩ rằng vấn đề là rằng phần $ tst [...] được đánh giá trong 'chế độ chuỗi' (đánh giá ký tự đầu tiên trong chuỗi; trong trường hợp này là "t"), trước khi đi tìm nạp thuộc tính từ đối tượng;

var_dump($tst, $tst['one']); // string(3) "tst" string(1) "t" 

Giải pháp là đặt niềng răng xung quanh tên biến ($this->{$tst}), nói với người phiên dịch để lấy giá trị của nó đầu tiên, và sau đó đánh giá phần [...].

var_dump($Object->{$tst}['one']); 

Tôi sẽ chấp nhận câu trả lời của Alex, vì nó chỉ cho tôi đúng hướng. Cảm ơn mọi người!

+0

Và bây giờ trong PHP 7, họ dường như cuối cùng đã thay đổi hành vi này. – Rijk

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