Dinamik Çocuk Sınıfı nesil - PHP

3 Cevap php

Ben Genelde ben sınıf I olarak aynı adlı kendi dosyasında, var olacağı bir sınıf yüklemek için sihirli işlevi __ özdevinimli_yükle ($ isim) kullanmak istiyorsunuz vb doğrulama ile birlikte temel CRUD işlevselliği sağlayan soyut bir "nesne" dersim var tembel yük diliyorum. Kod Tahmin edebileceğiniz gibi oldukça tekrarlayan olur böyle bir şey, olmazdı.

final class bicycle extends object {
    public function __construct($id=null) {
      parent::__construct($id, __CLASS__);
    }
    public function __toString() {
      return($this->name);
    }
}

Böylece yükü ve tasarım zamanı azaltarak - Benim soru nasılsa dinamik yüzden tekrar aynı özelliğe oluşturmak zorunda değilsiniz anında bu sınıfları oluşturmak olup olmadığını ya da değildir. PHP5 bile bu destekliyor mu yoksa ben sadece OO PHP gücünü overestimating ediyorum?

Teşekkürler!

3 Cevap

Bu işlevsellik PHP5'ta yok. Bu PHP6 mevcut olabilir, ama ubuntu için hiçbir paket beri var ama ben devam etmeyecektir.

Bunun yerine copy-yapıştırma Bu, neden sadece __construct kodunu ve object sınıf tanımında __toString yöntemleri koymuyorsun?

Böyle bir şey yapmanız gerekir:

class object {
    public function __construct($id = null) {
        $this->name = get_class($this);
    }
    public function __toString() {
      return($this->name);
    }
    protected $name;
}

final class bicycle extends object {

}

Ve diyorlar:

$a = new bicycle();
var_dump($a);

Alacağınız:

object(bicycle)[1]
  protected 'name' => string 'bicycle' (length=7)

Hangi doğru değerde adı property ile bicycle sınıfının bir örneğini demektir.

bicycle sınıfının kendi tanımı dışında - kopyalayıp yapıştırmak için herhangi bir kod gerek yok.


As a sidenote, if you really want to generate a class dynamically, you can probably use something like this :

$code = 'final class bicycle extends object {}';
eval($code);

Sadece dinamik $code değişkeni oluşturmak zorundayız.

Ancak, I would strongly advise against this,

  • Bu sınıf göremiyorum gibi, kod IDE yardımcı olmaz
  • Eğer sınıf için PHPDoc olmaz (same reason)
  • Orada "eval is evil" şeyler her zaman - ve en azından bu durumda, oldukça gerçek.
  • kullanarak "new bicycle" sınıfı yanlış hissediyor ilan kalmadan!
  • lazım eval kullanımı ile bazı performans ima olmak var

Yeni bir sınıf bildirme böyle bir acı değil, ve ben kesinlikle böyle bir şey kullanmak daha birkaç satır kopyalama-yapıştırma-modifiye tercih ederim.

Well, for __toString, you just put it in the parent class. Example follows:

class BaseObject {
    public function __toString() {
        return $this->name;
    }
}

class bicycle extends BaseObject {
}

$b = new bicycle();
$b->name = 'foo';
echo $b;

Sana CLASS geçmek kurucu geçersiz kılma ile gerçekleştirmek için çalışıyoruz ne tam olarak emin değilim.