PHP boş () __ get erişimcisinin üzerinde

2 Cevap php

empty() dinamik nesne özellikleri için başvuran zaman garip / non-sezgisel davranış yaşıyorum PHP 5.3 kullanarak __get() aşırı fonksiyonu üzerinden alındı. Aşağıdaki kod parçasını inceleyin:

<?php

class Test {

  protected $_data= array(
   'id'=> 23,
   'name'=> 'my string'
  );

  function __get($k) {
    return $this->_data[$k];
  }

}

$test= new Test();
var_dump("Accessing directly:");
var_dump($test->name);
var_dump($test->id);
var_dump(empty($test->name));
var_dump(empty($test->id));

var_dump("Accessing after variable assignment:");
$name= $test->name;
$id= $test->id;
var_dump($name);
var_dump($id);
var_dump(empty($name));
var_dump(empty($id));

?>

Bu fonksiyonun çıktısı aşağıdaki gibidir. Birinci ve ikinci sonuç kümeleri üzerinde empty() çeklerin sonuçları karşılaştırın:

Set # 1, beklenmedik sonuç:

string(19) "Accessing directly:"
string(9) "my string"
int(23)
bool(true)
bool(true)

Set # 2 ile aynı dönmek için Set # 1 bekliyor:

string(36) "Accessing after variable assignment:"
string(9) "my string"
int(23)
bool(false)
bool(false)

Bu gerçekten şaşırtıcı ve non-sezgisel. Boş olmayan dizeler çıktı ama empty() nesne özellikleri bunları boş dizeleri olarak değerlendirmektedir. Burada neler oluyor?

2 Cevap

empty 's manual page and comments (Ctrl-F for isset and/or double underscores), it looks like this is known behavior, and if you want your __set ve __get yöntemler ve empty birlikte güzel oynamak için bir okuma dayanarak, uygulamak örtülü bir varsayım var, bir __isset sihirli yöntem de.

Bu biraz unintuitive ve kafa karıştırıcı olduğunu, ancak özellikle PHP gibi bir sistemde en meta-programlama ile meydana eğilimindedir.

Bu örnekte, boş () değil __ get () aşırı yük fonksiyonu, () aşırı yük fonksiyonu __ isset çağırır. Bu deneyin:

class Test {

  protected $_data= array(
   'id'=> 23,
   'name'=> 'my string'
  );

  function __get($k) {
    return $this->_data[$k];
  }

  function __isset($k) {
    return isset($this->_data[$k]);
  }

}