bir arayüz ile etkileşim?

1 Cevap php

Ben okudum ne o tek bir arayüz ile etkileşim gibi görünüyor?

örn. sağlayan I ") yemek (" boş bir yöntemle bir arabirim var demek

sonra 2 alt sınıfları bu arabirimi uygulamaktadır.

benim denetleyicisi sadece arayüzü ile etkileşim ve () yöntemi yiyor kullanabilirsiniz?

Bu bağlantıyı resme bakmak strategy

1 Cevap

Bunu herhangi bir tanımlanmış sabitleri erişen veya TypeHints için kullanılması dışında bir arayüz ile etkileşime olamaz. Arayüzler yöntem bodys yok. Onlar sadece sınıfları uymalıdır uygulayan bir sözleşme tanımlamak içindir.

interface Logger
{
    const FOO = 1;
    public function log($msg);
}

echo Logger::FOO;  // 1
Logger::log($msg); // Fatal error: Cannot call abstract method Logger::log()
new Logger;        // Fatal error: Cannot instantiate interface Logger

Bkz http://php.net/manual/en/language.oop5.interfaces.php


coding against an interface or interacting with an interface temelde yöntemleri onları hayata sınıflarında defined in bir arayüz çağıran başka bir şey olduğu zaman genelde kastedilen budur. Sen uygulanmasını değil, tanım diyoruz. Tanımı sadece arabirimini uygulayan her sınıf için, belirtilen bağımsız değişkenlerle belirli bir yöntem olduğu için orada olduğunu belirtir.

Bu sınıfları düşünün:

Class DbLog implements Logger 
{
    public function log($msg) { /* log $msg to database */ }
}

Class FileLog implements Logger
{
    public function log($msg) { /* log $msg to file */ }
}

Her iki sınıf Logger uygulamak ve bir yöntem olması bunun log($msg). Bu temelde söylüyorsun: "hey class, if you want be a Logger, make sure I can call log() on you.". Şimdi yere kod sizin gibi, bir günlükçü ihtiyacı bir sınıf olabilir

class Foo
{
    protected $logger;
    public function __construct(Logger $logger)
    {
        $this->logger = $logger;
        $this->logger->log('I can haz logger! Yay!');
    }
}

O FileLog, DbLog veya başka concrete Logger alırsa Foo umursamıyor. Bu sadece o üzerinde log() çağırabilirsiniz any Logger alır umurunda. Foo log() ne ilgi bile değildir. Bütün Foo yaklaşık log() çağırmak mümkün ediliyor umurunda. Gerçi arayüzünde log() demeyeceğiz. Çünkü sadece coded against an interface, Sen Foo geçildi conrete sınıfında çağırıyor, ama size bağlı sayfasında gösterilen bulunuyor gibi bir UML diyagramı bu temsil ediyorum.

Bunun en büyük avantajı sınıflar daha az bağlanmış olmasıdır. Daha kolay birim-test alay kullanırken örneğin, bağımlılıkları dışarı takas olabilir, ve kod daha rahat olacaktır.

Temel olarak, bir kavramsal standardizasyon gibi bir arayüz düşünüyorum. Eğer yeni bir DVD Player satın aldığınızda Örneğin, sen bu şekilde oyuncu DVD'yi oynatmak yapar (sadece o kadar, umurumda değil) bir düğmesine olmasını bekliyoruz. Bu tuşa bastığınızda, bir DVD oynatıcı bir oynat düğmesi olması gerektiğini söyledi genel soyut DVD arayüz belirtimi değil basarak, ancak oyuncu bu marka üzerinde bir oynat düğmesi somut uygulanmasını tıkladım.