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!
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!) –
Hiển thị 'var_dump ($ Object -> $ tst)' là gì? – CodeCaster
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