PHP - küçük harf duyarlılığı olmadan Access nesne özellikleri?

3 Cevap php

Ben tutarsızlık çok kullanılan adlandırma kuralları var eski bir uygulama üzerinde çalışıyorum.

Harf duyarlılığını görmezden nesne özelliklerine erişmek için bir yolu var mı?

Örneğin, ben öznitelik ismi ile bir nesne denir CurrentUser var.

Bu gibi bu değeri almak için herhangi bir yolu var mı?

$currentuser->name

Herhangi bir tavsiye takdir.

Teşekkürler.

3 Cevap

Peki, böyle bir dönüşümü ele edeceğini sınıfların her bir __get işlev yazabilirsiniz, ama oldukça hacky bulunuyor. Böyle bir şey işe yarayabilir:

class HasInconsistentNaming {

    var $fooBar = 1;
    var $Somethingelse = 2;

    function __get($var) {
        $vars = get_class_vars(get_class($this));
        foreach($vars as $key => $value) {
            if(strtolower($var) == strtolower($key)) {
                return $this->$key;
                break;
            }
        }
        return null;
    }
}

Şimdi, bunu yapabilirsiniz:

$newclass = new HasInconsistentNaming();

echo $newclass->foobar; // outputs 1

Size görev biraz basitleştirmek istiyorsanız bu işlevselliği sağlayan bir sınıf devralmasını baz sınıfları olabilir. Bu şekilde sizin sınıfların her fonksiyon yazmak zorunda değilsiniz:

class CaseInsensitiveGetter {
    function __get($var) {
        $vars = get_class_vars(get_class($this));
        foreach($vars as $key => $value) {
            if(strtolower($var) == strtolower($key)) {
                return $this->$key;
                break;
            }
        }
        return null;
    }
}

class HasInconsistentNaming extends CaseInsensitiveGetter {
    var $fooBar = 1;
    var $Somethingelse = 2;
}

Ama ben kesinlikle bu yaklaşım sizi vazgeçirmek istiyorum. Uzun vadede, sadece tutarlı bir adlandırma düzeni içine tüm değişkenleri dönüştürmek çok daha akıllı olurdu.

İlginç bir soru. Ne istediğinizi elde etmek için iki yol vardır. Eğer dizi üzerinden interate için foreach kullanın veya php yansıma işlevleri bir göz ya (http://www.php.net/manual/en/book.reflection.php).

Eğer nesne üzerinde hiçbir kontrolü (belki bir dış veritabanından bir satır var) varsa, i satırları erişmeden önce, doğru isimleri bulmak için öneriyoruz. Aşağıdaki fonksiyonu ucuz bir işlem değildir, ancak ilk kez yapılan bu uygulama daha istikrarlı yapabilirsiniz.

function findPropertyNameCaseInsensitive($obj, $name)
{
  $propertyNames = array_keys(get_object_vars($obj));
  foreach($propertyNames as $propertyName)
  {
    if (strcasecmp($name, $propertyName) == 0)
      return $propertyName;
  }
  return NULL;
}