OO PHP foreach döngüsünde mevcut özellikleri değil korumalı?

6 Cevap php

Ben izin kısıtlamaları içinde olan benim uygulamada tüm değerleri kontrol etmek için kullanmak istiyorum bir doğrulama sınıf var.

Ben (bu durumda Kullanıcı) başka bir sınıftan, doğrulama sınıfı içinde statik bir fonksiyona bir nesne geçirerek

function validate() {
    $errors = Validation::validate($this);
}

Doğrulama sınıfında, ben yeni bir nesne oluşturmak ve daha sonra geçirilen parametre nesnesinin (ya da en azından ben yapmak istiyorum ne) özellikleri ile devam edin.

function validate($object) {
            $validation = new Validation();
            print_r($object);
            print_r('<br />');
            foreach($object as $key => $val) {
                print_r($val);
                isset($val->maxlength) ? $validation->validateLengthNoMoreThan($val->value, $val->maxlength) : null;
                isset($val->minlength) ? $validation->validateLengthAtLeast($val->value, $val->minlength) : null;
                isset($val->required) && ($val->required == true) ? $validation->validateNotBlank($val->value) : null;
            }
            return $validation->errors;
        }

Ben sadece test amaçlı işlev içinde değerlerini basmak. Nesne foreach döngüsü ince dışında yazdıran, ama ben döngü içinde değerlerini erişmeye çalışırsanız, hiçbir şey görüntülenmez neden nedir ben anlamıyorum değildir.

Bu foreach döngüsü dışında görüntülenir budur:

User Object ( 
[username:protected] => Property Object ( [value] => aaa [maxlength] => 12 [minlength] => 3 [required] => 1 ) 
[firstname:protected] =Property Object ( [value] => aaa [maxlength] => 12 [minlength] => 3 [required] => 1 )
[lastname:protected] =Property Object ( [value] => aaa [maxlength] => 12 [minlength] => 3 [required] => 1 ) 
) 

Doğrulama sınıfı kullanıcı sınıfını genişleten DEĞIL, yani değerler kullanılabilir olmaz neden onlar değil, bunun içinde döngünün dışında kullanılabilir sadece neden ben, anlıyorum.

Ayrıca, ne korumalı / özel özellikleri üzerinde doğrulama yürütmek için en iyi yol olacağını?

Herhangi bir tavsiye / ipuçları büyük mutluluk duyacağız.

Teşekkürler.

6 Cevap

Sen gerçek nesnenin içindeki özelliklerini foreach'ing bu soruna alabilirsiniz. Yani her nesne bir arayüz ile zorlamak olabilecek bir validate () fonksiyonu, sahip olmalıdır. Örneğin:

class MyClass implements Validator {
  $var1;
  $var2;

  public function validate(){ //required by Validator interface
     $validation = new Validation();
     foreach($this as $k=>$v) {
        //run validations
     }
     return $validation->errors;     
  }
}

Dokümanlar (http://us3.php.net/manual/en/language.oop5.visibility.php):

Üyeler korumalı ilan yalnızca sınıfın kendisi içinde ve miras ve üst sınıfları tarafından erişilebilir.

ve gelen http://us3.php.net/manual/en/function.print-r.php:

print_r (), var_dump () ve var_export () ayrıca korumalı ve PHP 5 ile nesnelerin özel özellikleri. Statik sınıf üyeleri gösterilmeyecektir gösterecektir.

Print_r () bir şeyler yazdırmak sırf, bu kod tarafından ulaşılabilir anlamına gelmez. () 'özel' fonksiyonlar olmak print_r (), var_dump () ve var_export düşünün.

Scott Saunders doğru PHP docs say bunu yapamam gösterir ama PHP var_export ile bu nesne bilgi mevcut yapar.

Sonuç olarak size kötüye olabilir eval özel olsun ve korunan nesne böyle bağlıyor:

function get_object_vars_all($obj) {
  $objArr = substr(str_replace(get_class($obj)."::__set_state(","",var_export($obj,true)),0,-1);
  eval("\$values = $objArr;");
  return $values;
}


Here's a quick example...

class Test {
  protected $protectedAttrib = "protectedVal";
  private  $privateAttrib = "privateVal";
  public $publicAttrib = "publicVal";
}

$test = new Test();
print_r(get_object_vars_all($test));

... Çıkışlar ....

Array
(
    [protectedAttrib] => protectedVal
    [privateAttrib] => privateVal
    [publicAttrib] => publicVal
)

O OO kullanmanın amacı yendi, ama olabilir, çünkü really bunu yapmamalısınız!

Birçok kişi çeşitli nedenlerle eval kullanarak sevmiyorum ilave notta, bir tartışma var here.

Kullanıcı nesnesinin özelliklerini korumalı veya özel ise, o zaman foreach onları hareket olmaz. Eğer foreach deyimi içinde onlara erişemez neden açıklayabilir.

http://www.php.net/manual/en/class.arrayiterator.php: Bu durumda ise, SPL ArrayIterator arayüzü kullanarak kolayca çözülebilir

Korumalı veya özel değerlerine erişmek için nesne üzerinde bir yansıma kullanın:

$refl = new ReflectionObject($object);
$prop = $refl->getProperty('yourproperty');
$prop->setAccessible(true);
$value = $prop->getValue($object);

DespairTyre tarafından verilen aynı uyarı bu çözüm için geçerlidir: özellikleri korunmuş veya özel neden nedenleri vardır. Ancak, belirli bir sınıfın kodunu değiştirmek ama bu özellikleri bulunuyor erişmek gerek istemiyorum durumlar da vardır ...

Sen get_object_vars () işlevi yapabilirsiniz:

    $vars = get_object_vars($obj);

    foreach ($vars as $field=>$value){
         ...
    }

Bu sit alanları ile çalışır.