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.