Bir nesne özelliği PHP özel olup olmadığını tespit

5 Cevap php

Ben onun özel olanlar, sadece kamu özelliklerine dayalı bir SQL sorgusu, bina özelliklerini yinelemek bir PHP (5) nesne yapmak için çalışıyorum.

Bu üst nesne yöntem alt nesneler tarafından kullanılmak için olduğu gibi, ben sadece (ben onlar alt nesneler ne bilemezsiniz) adıyla özel özelliklerini atlamak için seçemezsiniz.

Özel olan özelliklerinin bir nesne içinde algılamak için basit bir yolu var mı?

İşte ben bugüne kadar ne var basitleştirilmiş bir örnektir, ama bu çıkış $ bar değerini içerir:

class testClass {

    public $foo = 'foo';
    public $fee = 'fee';
    public $fum = 'fum';

    private $bar = 'bar';

    function makeString()
    {
        $string = "";

        foreach($this as $field => $val) {

            $string.= " property '".$field."' = '".$val."' <br/>";

        }

        return $string;
    }

}

$test = new testClass();
echo $test->makeString();

Çıktıyı verir:

property 'foo' = 'foo'
property 'fee' = 'fee'
property 'fum' = 'fum'
property 'bar' = 'bar' 

Ben 'bar' kapsamamaktadır istiyorum.

Bir nesnenin sadece kamu özelliklerini yinelemek için daha iyi bir yolu varsa, o da burada çalışmak.

5 Cevap

http://php.net/manual/reflectionclass.getproperties.php#93984 bu kodu kontrol edin

  public function listProperties() {
    $reflect = new ReflectionObject($this);
    foreach ($reflect->getProperties(ReflectionProperty::IS_PUBLIC /* + ReflectionProperty::IS_PROTECTED*/) as $prop) {
      print $prop->getName() . "\n";
    }
  }

Sen, kamu özelliklerini saklamak bazı sarıcı yöntem eklemek ve SQL veri eklemek için dizi kullanmak için bir dizi kullanabilirsiniz.

Bunun üzerinde yineleme önce bir dizi nesne artığını ise, özel ve korunan üyeleri özel önek olacak:

class Test{
  public $a = 1;
  private $b = 1;
  protected $c = 1;
}
$a = new Test();
var_dump((array) $a);

Bu görüntüler:

array(3) {
  ["a"]=>
  int(1)
  ["Testb"]=>
  int(1)
  ["*c"]=>
  int(1)
}

Gizli karakterler görüntülenmez alamadım ki, orada çok. Ama onları algılamak için kod yazabilirsiniz. Örneğin, düzenli ifade /\0\*\0(.*)$/ korunmuş anahtarları maç olacak, ve /\0.*\0(.*)$/ özel olanları maç olacak. Hem de, ilk yakalayan grup üye adı eşleşir.

Ben buldum bir daha hızlı bir çözüm:

class Extras
{
    public static function get_vars($obj)
    {
        return get_object_vars($obj);
    }
}

ve sonra TestClass içinde arayın:

$vars = Extras::get_vars($this);

Original source - additional reading