Yöntemler sınıf dışında tanımlanmış?

7 Cevap php

Genellikle C + + yapılır gibi php yöntemler hiç sınıf vücudun dışında tanımlanan merak ediyorum. Bu soru Defining class methods in PHP olarak aynı olduğunu biliyoruz. Ama ben bu yüzden tüm cevaplar biraz uygunsuz görünüyor onun özgün soru yerine 'tanımlamak' arasında 'declare' vardı inanıyorum.

Update:

Muhtemelen tanımlamak ve beyan benim fikrim kusurlu idi. Ama genel olarak sınıf vücudu dışında tanımlamak, ben C + + eşdeğer bir şey demek

class CRectangle {
    int x, y;
  public:
    void set_values (int,int);
    int area () {return (x*y);}
};

void CRectangle::set_values (int a, int b) {
  x = a;
  y = b;
}

Php kod tüm örnekler C + + inlined fonksiyonu gibi sınıf gövdesinin içinde kodu var. PHP iki tarzı, onun sadece bir soru arasında fonksiyonel bir fark olacağını bile.

7 Cevap

Başlık dosyalarında yöntemlerin bildirilmesinin bunların uygulanması ayrı olması, benim gördüğüm kadarıyla, C / C + + için oldukça benzersiz olduğunu. Bütün bildiğim diğer diller de tüm o var, ya da yalnızca (Java ve C # arayüzleri gibi) sınırlı biçimde yok

Burada asla kullanılmamalıdır korkunç, çirkin, kesmek. Ama, bunu sen istedin!

class Bar {
    function __call($name, $args) {
        call_user_func_array(sprintf('%s_%s', get_class($this), $name), array_merge(array($this), $args));
    }
}

function Bar_foo($this) {
    echo sprintf("Simulating %s::foo\n", get_class($this));
}

$bar = new Bar();
$bar->foo();

Ben ne yaptım? Her neyse, sadece sınıfın adı ve bir alt çizgi ile önek, yeni yöntemler eklemek. Işlevinin ilk argümanı $this için bir referanstır.

Her şeyden önce, PHP, tüm sınıf yöntemleri tanımlanmış olmalıdır ve class bünyesinde uygulanan (class x { }). Bu uygulamaları (*.cpp) tanımların ayrı olması C + + buradaki gibi hiçbir şekilde (*.h).

Hayır 'declare' düşünün ve bu soru içinde değiştirilebilir 'tanımlamak' olabilir.

Mümkün, ama çok, çok hacky ve tavsiye değil. Ya bunu yapmak için bir sebep yok.

Beyanı ve sınıf yöntemlerin uygulanmasını ayırmak için bir yol ararken ben bu soruya tökezledi. Neden? Okunabilirliğe uğruna. Bildirimleri, ayrı bir dosyada, veya sınıf dosyasının en üstünde olduğunda sınıfını kullanmak isteyen birisi yöntemler sunulmaktadır hangi öğrenmek için tüm uygulama zorla zorunda değildir.

Ama bir şey yararlı buldunuz: PHP arayüzü sınıfları. Ben bunun için tasarlanmış sanmıyorum, ama amaca hizmet: bir arabirim sınıfı tüm yöntemlerini tanımlar ve daha sonra "gerçek" sınıf bunları uygular. İşte bu konuda bir makale:

http://www.davegardner.me.uk/blog/2010/11/21/why-you-should-always-use-php-interfaces/

Natively PHP bu gibi özellikleri desteklemez, ama PHP5.4 beri dynamically add methods nesne olabilir. Örnek olarak, bu bakabilirsiniz: https://github.com/ptrofimov/jslikeobject