php OOP işlev bildirimleri

2 Cevap php

Ben php OOP büyük bir hayranı değilim, ama ben çok hızlı dağınık alır sınıf yöntemleri tanımlayan gibi hissediyorum. Ben C + + OOP oldukça iyi bir altyapıya sahip, ve ben orada nasıl işlendiğini ile oldukça rahatım, ve php benzer şekilde bunu yapmanın bir yolu varsa merak ediyorum.

Daha spesifik olmak gerekirse, burada ben ne demek olduğunu. Ben C + + bir sınıf başlığı (MyClass.h) tanımlayabilir ve daha sonra uygulama dosyası (myclass.cc) işlevlerin gerçek ayrıntılarını tanımlamak nasıl seviyorum. Ive bu kolayca php arayüzlerini kullanarak çoğaltılmış olabilir bulundu, ama aşağıdaki için iyi bir çözüm bulundu sığınak:

Örneğin, sınıfın dışında denebilecek kamu yöntemleri 1 yerinde olacağını bu yüzden onlar, erişilen nasıl dayalı farklı dosyalarda C + + kodumu düzenlemek ister ve özel yöntemleri başka bir yerde organize edilecek olan - bu kişisel tercihi.

Ive gibi php sınıfı yöntemlerini tanımlamak için çalıştı:

private function MyPHPClass::myFunction(){ }

tanımı sınıf blok ({}) içine doğrudan değil, ama bunu yaparken herhangi bir başarı vardı sığınak zaman.

Ive php.net üzerindeki tüm sayfaları yoluyla olmuştur, ama bu böyle bir şey bulamadı. Im böyle bir şey için herhangi bir destek olduğunu varsayarak, ama ben yine de sormak düşündüm.

teşekkürler

2 Cevap

Im gerçekten php bir C + + / C # Programcı ama arayüzleri ben bu yardımcı olmadığını görmek için bir exampe verebilir değil.

Interface

interface IDatabase
{
   public function connect($dns = '');
   public function disconnect($flushCache = false); //Do not use braces, Code free in interfaces
}

Database abstract base class

abstract class Database
{
   //Some driver logic here to laod mysql,oracle etc
}

MySql Driver

class DBDriver_MySQl extends Database implements IDatabase
{
   public function connect($dns = '')
   {
     //Connection logic.
   }
   public function disconnect($flushDns)
   {
     //Disconnect Login
   }
}

Bu arıyor ne olduğunu umuyoruz.

Bunu yapamazsın. Sınıf bildirimleri Java gibidir.

Siz bir dosyada her şeyi koymak zorunda ya, en azından, bazı yardımcı sınıfları var - olması sadece statik yöntemleri hangi ileri sizin veya aramaları veya kapsüllü nesnelere bazı uygulanmasını ertelemek ile. Ayrıca __call ve __callstatic sihirli yöntemleri için taslakları boyutunu azaltmak için kullanabilirsiniz, ancak bu sadece kamu yöntemleri için çalışıyor ve ben sihirli yöntemleri önlemek tavsiye ediyoruz.

EDI2: RobertPitt yorumunda belirttiği gibi, birkaç sınıflar arasındaki işlevsellik bölmek alternatif stratejiler düşünmelisiniz. Bu kodunuzu daha Bağlamadan yapabilirsiniz ekledi avantajı vardır. Eğer ihtiyacınız varsa, yine bir cephe arkasında çeşitli sınıflardan işlevselliğini birleştirmek olabilir.

EDIT: sihirli yöntemler kullanarak, ben böyle bir şey demek:

class MyClassHelper {

    public function method_one(array $args) {
        ...
    }

    public function method_two(array $args) {
        ...
    }
}

class MyClass {
    /**
     * @var MyClassHelper
     */
    private $helper;

    private static $ALLOWED_METHODS = array("method_one" => NULL,
        "method_two" => NULL);

    public function __call($name, $arguments) {
        $name = strtolower($name);
        if (array_key_exists($name, self::$ALLOWED_METHODS) {
            $helper->$name($arguments);
        }
        else
            throw new Exception(...);
    }
}

Bunu önlemek öneririz gerekir, bu (referansların kullanımı, hiçbir kod tamamlama) birçok tuzaklar vardır.