Genellikle arayüzleri sözleşmeleri tanımlamak için kullanılır, bu yüzden tür denetlemesini olsun edilir. Iyi bir fikir "arayüzler karşı programlama" adlı bir programlama tarzı da vardır. Bkz Dependency Inversion Principle:
A. Yüksek seviyeli modüller düşük seviye modüllere bağlıdır olmamalıdır. Hem soyutlamalar bağlı olmalıdır.
B. Abstractions ayrıntılar bağlı olmamalıdır. Detaylar soyutlamalar bağlı olmalıdır. "
Yerine type hinting sınıflara karşı bir, işlevleri ve yöntemleri tanımlamak Yani, sadece arayüzleri karşı ipucu.
İşte bir örnek. Şöyle diyelim, sen giriş akışları için arabirimleri tanımlamak ve çıkış akışları:
interface OutputStream{
write($string); // Writes a string to the output.
close(); // Closes the output stream.
}
interface InputStream{
read($length); // Reads at most $length characters.
eof(); // TRUE, if the input stream is empty.
}
Şimdi yaratabilecek copy
işlev veya yöntem, hangi kopya bunlardan herhangi birine sahip olmayan bir girişe bir derenin tam çıkışı:
// 50 is just chosen randomly.
function copy(InputStream $input, OutputStream $output){
while(!$input->eof()){
$output->write($input->read(50));}}
Tebrikler, copy
uygulama şimdi bir tane bile uygulama olmadan bir giriş ve çıkış akımının every kombinasyonu için çalışıyor.
Özet sınıfları, diğer taraftan, tam fonksiyonel sınıfı uygulamak zorunda kalmadan ortak özelliğe uygulamak için kullanılabilir.
Yine bir örnek. Eğer çıkış akışları istiyorum, diyelim. Sen çıkışına bir dize yazar ve çıkış dizesi ve ek bir yeni satır yazar bir yöntem writeLine($s)
, istediğiniz bir yöntem write($s)
, istiyorum. O zaman bu uygun olacaktır:
abstract class AbstractOutputStream{
public function writeLine($s){
$this->write($s."\n");}}
Beton çıktı akımları artık, soyut çıktı akımına devralan uygulamak sadece write
ve writeLine
ücretsiz alabilir!