GithubHelp home page GithubHelp logo

php's Introduction

PHP

Başlıklar

PDO

Veritabanı adı: veri

Tablo adı: veriler

id baslik icerik onay tarih
1 pdo1 pdo ile veritabani1 1 2020-02-15 22:24:39
2 pdo2 pdo ile veritabani2 1 2020-02-15 22:25:39
3 pdo3 pdo ile veritabani3 1 2020-02-15 22:26:39
4 pdo4 pdo ile veritabani4 1 2020-02-15 22:27:39
5 pdo5 pdo ile veritabani5 1 2020-02-15 22:28:39

Veritabanı Bağlantısı 🐘

<?php
    try
    {
	//PDO Nesnesi. Parametreler: dsn,username,passwd
        $db = new PDO('mysql:host=localhost;dbname=veri','root',''); 
    }
    catch (PDOException $e)
    {
        //bağlantı başarısız olursa hatayı yakalayıp bilgi alıyoruz.
        $e -> getMessage();
    }
?>

Veri Ekleme (INSERT) 🐘

INSERT INTO Tablo_Adi SET kolon1 = değer1;
//veriler tablosuna ekleme işlemi
$sorgu = $db -> prepare('INSERT INTO veriler SET
        baslik = ?,
        icerik = ?,
        onay = ?');

//baslik,icerik ve onayı işlem dizisine koyuyorum.
$ekle = $sorgu -> execute([
        $baslik,
        $icerik,
        $onay
        ]);

//eğer ekleme işlemi başarılıysa
if ($ekle)
        {
            //yönlendirme işlemi yapıyorum.
            header('Location:index.php');
        } 
else 
        {
            //değilse hata mesajını alıp ekrana basıyoruz.
            $hata = $sorgu -> errorInfo();
            echo "MySQL Hatası: ".$hata[2];
        }

Veri Listeleme (SELECT) 🐘

SELECT * FROM Tablo_Adi WHERE id = ?;
//veriler tablosundan id'si =
$sorgu = $db -> prepare('SELECT * FROM veriler WHERE id=?');
$sorgu -> execute([
    //get edilen id'ye eşit olanı al
    $_GET['id']
]);

//zaten tek bir veri alacağız o yüzden fetch() kullandım. (o id'ye ait olan)
$veri = $sorgu -> fetch(PDO::FETCH_ASSOC)

Veri Güncelleme (UPDATE) 🐘

UPDATE Tablo_Adi SET kolon1 = değer1 WHERE kolon=değer;
  $sorgu = $db->prepare('UPDATE veriler SET
                baslik = ?,
                icerik = ?,
                onay = ?
                WHERE id = ?'); //id'si şu olan...

//sorgu değişkenimi execute ediyorum ve güncelle değişkenine atıyorum.
  $guncelle = $sorgu->execute([
                $baslik, $icerik, $onay, $veri['id']
            ]);
	    
//eğer güncelleme başarılıysa
if ($guncelle) 
{
	header('Location:index.php?sayfa=oku&id=' . $veri['id']);
} 
else
{
	echo "Güncelleme işlemi başarısız!";
}

Veri Silme (DELETE) 🐘

DELETE FROM Tablo_Adi WHERE id = 2;
$sorgu = $db -> prepare('DELETE FROM veriler WHERE id = ?'); //veriler tablosunda id'si...

$sorgu -> execute([
    $_GET['id'] //... şu olan veriyi sil
]);

//daha sonra index.php'ye yönlendir.
header('Location:index.php');

Şimdi ise verilerimizi ilişkilendirebilmek için "verikategorisi" isimli bir tablo daha oluşturuyoruz.

Veritabanı adı: veri (aynı veritabanında çalışıyoruz)

Tablo adı: verikategorisi

id ad
1 php
2 asp.net core
3 nodejs
4 django

bununla birlikte veriler tablomuza verikategorisi tablosunun id'si ile eşleştireceğimiz kategori_id kolonunu ekliyoruz.

id baslik icerik kategori_id onay tarih
1 pdo1 pdo ile veritabani1 1 1 2020-02-15 22:24:39
2 pdo2 pdo ile veritabani2 1 1 2020-02-15 22:25:39
3 pdo3 pdo ile veritabani3 1 1 2020-02-15 22:26:39
4 pdo4 pdo ile veritabani4 1 1 2020-02-15 22:27:39
5 pdo5 pdo ile veritabani5 1 1 2020-02-15 22:28:39

Birleştirici (JOIN) Kullanımı 🐘

INNER JOIN Tablo_Adi ON Tablo_Adi.id = digerTablo_Adi.id;

Inner Join ile ortak değere sahip iki tablodaki ilişkili değerleri seçelim ve birleştirelim.

Query içinde kullanımı:

SELECT veriler.id , veriler.baslik , verikategorisi.ad AS kategori_adi , veriler.onay FROM veriler
INNER JOIN verikategorisi ON verikategorisi.id = veriler.kategori_id
ORDER BY veriler.id DESC;

fetchAll() ile bu verileri çektiğimizi ve $veriler isimli bir değişkene atadığımızı varsayalım.

<?php if ($veriler): ?>
        <ul>
        <!-- foreach ile veriler çekiliyor $veriler as $vr-->
    <?php foreach ($veriler as $vr): ?>
        <li>
            <!--İçeriklerin başlıkları ve kategorileri listelendi-->
            <?php echo $vr['baslik']; ?>
            (<?php echo $vr['kategori_adi']; ?>)
            <div>
              <?php if($vr['onay'] == 1): ?>
                  <!--Sadece onaylı olan içeriklerin başlıkları gösterilecek.-->
                  <a href="index.php?sayfa=oku&id=<?php echo $vr['id'];?>">[OKU]</a>
              <?php endif; ?>
              <a href="index.php?sayfa=formUpdate&id=<?php echo $vr['id'] ?>">[DÜZENLE]</a>
              <a href="index.php?sayfa=sil&id=<?php echo $vr['id'] ?>">[SİL]</a>
          </div>
        </li>
    <?php endforeach;?>
        </ul>
<?php else: ?>
    <!--veri yoksa...-->
    <div>Henüz eklenmiş veri bulunmuyor!</div>
<?php endif; ?>

Left Join

SELECT * FROM Tablo_Adi LEFT JOIN digerTablo_Adi ON Tablo_adi.id = digerTablo_Adi.id;

Sol tablodaki tüm satırları ve koşula uygun olan sağ tablodaki satırları seçip birleştirelim ve bunları gruplayalım.

Query içinde kullanımı:

SELECT verikategorisi.* , COUNT(veriler.id) AS toplamVeri 
FROM verikategorisi
LEFT JOIN veriler ON veriler.kategori_id = verikategorisi.id
GROUP BY verikategorisi.id

fetchAll() ile bu verileri çektiğimizi ve $kategori isimli bir değişkene atadığımızı varsayalım.

<ul>
    <?php foreach ($kategori as $kt): ?>
    <li>
        <a href="index.php?sayfa=kategori&id=<?php echo $kt['id'];?>">
            <?php echo $kt['ad']; ?>
            (<?php echo $kt['toplamVeri']; ?>)
        </a>
    </li>
    <?php endforeach; ?>
</ul>

Arama İşlemi (LIKE) Kulanımı 🐘

SELECT * FROM Tablo_Adi WHERE Kolon_Adi LIKE "%a%";

LIKE komutu WHERE komutu ile birlikte bir kolonda ilgili değeri aramak için kullanılır.

Joker Karakterler:

* Birden fazla bilinmeyen karakteri sorgulatacaksak kullanırız.
# Bilinmeyen tek rakam için kullanırız.
? Bilinmeyen tek karakter için kullanırız.

Query içinde kullanımı:

<?php

$sql = ' SELECT veriler.id,veriler.baslik,verikategorisi.ad as kategori_adi,veriler.onay FROM veriler
INNER JOIN verikategorisi ON verikategorisi.id = veriler.kategori_id'; 
//sql sorgumu değişkene atadım

if (isset($_GET['arama'])) //eğer bir arama yapılmışsa
{
    //bu ifadeyi de sql ifademe dahil edeceğim:
    $sql .= ' WHERE veriler.baslik LIKE "%' . $_GET['arama'] . '%" || veriler.icerik LIKE "%' . $_GET['arama'] . '%" ';
}
$sql .= ' ORDER BY veriler.id DESC';


$veriler = $db->query($sql)->fetchAll(PDO::FETCH_ASSOC);
//son eklenen verilere göre listele

?>

OOP

Sınıflar 🐘

Bir sınfı tanımlamak için class anahtar kelimesi kullanılır ve ardından sınıfın özel ismi yazılır. Sınıflar isimlendirilirken barındıracağı özellikler neticesinde ve yerine getireceği işlevler düşünülerek isimlendirme yapılması mantıklı olandır. İsimlendirme yapılırken türkçe karakter kullanımına izin vermektedir. Harf veya alt çizgi ile sınıf ismini başlatabiliriz.

Örnek Sınıf Kullanımı:

<?php
class Uye
{ 
    public $ad = 'Melih'; //özellik tanımlamaları
    public $soyad = 'Celik';
    const DOGUMTARIHI = 1999; //sabit tanımı
    
    //başına public koyulmaz ise varsayılan olarak public atanır
    function stringAdDondur()
    {
        return 'Melih';
    }

    public function stringSoyadDondur()
    {
        return 'Celik';
    }

    //geriye değer döndüren parametreli fonksiyon
    public function kacYasinda($gunumuz,$dogumTarihi)
    {   
        return $gunumuz - $dogumTarihi;
    }

    //özellikleri kullanarak fonksiyon içerisinde değer geri döndürmek için $this kullanılır ve this ile yerel özelliklere erişim sağlanır.
    function adDondur()
    {
        return $this->ad;
    }
    function soyadDondur()
    {
        return $this->soyad;
    }

    //fonksiyon içerisinde fonksiyonumuzu döndürmek isteseydik
    function yasBas()
    {
        return $this->kacYasinda(2020,$this::DOGUMTARIHI);
    }
    
    //sabiti geriye döndürmek
    function dogumTarihi()
    {
        return $this::DOGUMTARIHI;
    }//veya self kullanabiliriz
    function dogumTarihi2()
    {
        return self::DOGUMTARIHI;
    }
}
?>

Şimdi bu sınıftan nesneler türetelim

<?php
//sınıftan nesne olusturma
$uye = new Uye();
//veya 
$uye2 = new Uye;
?>

nesnelerimiz ile bu sınıfın özellik ve metotlarına erişelim:

Sınıf içerisindeki özelliklere ve metotlara erişmek için -> işareti kullanılır

Metotlara erişmek ve ekrana yazdırmak

echo $uye->stringAdDondur() . "<br>";

Özelliğe erişmek ve ekrana yazdırmak

echo $uye->soyad . "<br>" ;

Sabite erişmek ve ekrana yazdırmak

echo $uye::DOGUMTARIHI;

uye2 için özelliklere farklı değerler atayalım

$uye2->ad = 'Farklıİsim';
$uye2->soyad = 'FarkliSoyad';

uye2'nin değerlerini ekrana yazalım

<?php
echo "<hr>";
echo "<br>". $uye2->ad;
echo "<br>". $uye2->soyad;
echo "<br>". $uye2::DOGUMTARIHI;
?>

Parametreli metodu çağırmak

<?php
echo "<hr>";
echo "KAÇ YAŞINDALAR?" . "<br>";
echo $uye->kacYasinda(2020,$uye::DOGUMTARIHI);
?>

Özellik ve fonksiyonları geri döndüren fonskiyonları çağırmak

<?php
echo "<hr>";
echo "Birde özellikleri geri döndürerek ad ve soyadı ekrana bastıralım" . <br>";
echo $uye->adDondur() . "<br>";
echo $uye->soyadDondur()."<br>";
echo "<br>". "Birde metodu geri döndürerek yaşı ekrana bastıralım" . "<br>";
echo $uye->yasBas()."<br>";
?>

this nesneyi referans alır,self ise sınıfı referans alır

This ve self ile sabit döndüren fonksiyonların ekrana bastırılması

<?php
echo $uye->dogumTarihi()."<br>"; //this kullanıldı
echo $uye->dogumTarihi2(); //self kullanıldı
?>

Çıktı

php-sınıf-çıktı

Görünürlük 🐘

Bir özellik, sabit ya da metodun görünürlüğünü üç farklı şekilde belirleyebiliriz. Kullanımlara örnek sınıf üzerinden bakacak olursak:

<?php
class Test
{
    public $a = 'a'; //her yerden erişilebilir.

    private $b = 'b'; //sadece sınıf içerisinden erişilebilir

    public function geriDonB()
    {
        return $this->b; //private özelliği public metotta geriye döndürebilirim
    }

    protected $c = 'c';
    //korumalı, aynı private gibi dışarıdan erişilemez sınıf içinde erişilebilir, miras aldığımız sınıfta da kullanabiliriz

    private function geriDonA() //private func
    {
        return $this->a;
    }

    protected function geriDonC() //protected func
    {
        return $this->c;
    }
}
?>

Şimdi bu özellik ve metotları ekrana bastırmaya çalışalım

<?php
$test = new Test;

echo $test->a; //bu özelliğe rahatça ekrana basabildim

echo $test->b; //bu özelliği ekrana bastırmak istediğimde hata ile karşılaşıyorum

echo $test->geriDonB(); //private özelliği public fonksiyon ile bastırdım

echo $test->c; //hata

echo $test->geriDonA(); //hata

echo $test->geriDonC(); //hata
?>

Kurucu ve Yıkıcı Metot 🐘

Kurucu metot bir sınıf başlatıldığında otomatik olarak çağrılacak fonksiyondur.

<?php
    public function __construct($a)
    {
			.		.		.
    }
?>

Yıkıcı metot bir sınıfın çalışması bittiğinde çalışacak son metot.

<?php
    public function __destruct()
    {
			.		.		.
    }
?>

Örneğin;

<?php

class YapYik
{
    private $degisken;

    //parametreli kurucu metot
    public function __construct($a)
    {
        $this->degisken = $a;
        echo $this->degisken.PHP_EOL;
    }

    public function bas()
    {
        echo 'ekrana yazı bastım'.PHP_EOL;
    }

    //yıkıcı metot
    public function __destruct()
    {
        echo 'yıkıcı metot çalıştı'.PHP_EOL;
    }

}
 
$nesne = new YapYik('Kurucu metot çalıştı');
$nesne->bas();

?>

Çıktı

çıktı

Kalıtım 🐘

Kalıtım sınıf ve nesne ilişkilerini düzenleyen iyi kurgulanmış bir prensiptir. Türeyen sınıflar ,türetilen sınıfların özellik ve metotlarını public ve protected olduğu sürece kullanabilirler. Genişletmek için extends deyimi kullanılır.

Örnek bir temel(base) - ebeveyn(parent) sınıf :

<?php
class Calisan
{
    public $maas;
    public $adsoyad;

    public function setAdSoyad($adsoyad)
    {
        //sınıfın içerisindeki adsoyad dışarıdan gelen adsoyad değerine eşit olsun
        $this->adsoyad = $adsoyad;
    }

    public function maas($maas)
    {
        //sınıfın içerisinde maas dışarıdan gelen maas değerine eşit olsun
        $this->maas = $maas;
    }

    public function senelikMaas()
    {
        return ($this->maas*12).'₺';
    }
}
?>

Calisan sınıfından türetilen Muhasebe sınıfı:

<?php
class Muhasebe extends Calisan{}
?>

Calisan sınıfından türetilen IT sınıfı:

Temel sınıfta bulunan bir fonksiyonu türeyen sınıfta tekrar tanımlayıp ama temel sınıftaki fonksiyonu kullanmak istersem parent deyimini kullanırım

<?php
class IT extends Calisan{
    public function senelikMaas()
    {
        return 'IT Çalışanı: '.$this->adsoyad.' senelik maaş olarak '.parent::senelikMaas();
    }
}
?>

Zincirleme olarak kalıtım almak ve en aşağıdaki sınıftan en temel sınıfın özellik ve metotlarına erişmek:

<?php
class x
{
    public function bas()
    {
        return 'x:bas';
    }
}
class y extends x
{
    public function bas()
    {
        return 'y:bas';
    }
}
class z extends y
{
    public function bas()
    {
        return 'z:bas';
    }
    public function basGetir()
    {
        return [
            'z' => self::bas(),
            'y' => parent::bas(),
            'x' => x::bas()
        ];
    }
}

$z = new z;
print_r($z->basGetir());
?>

Static Deyimi 🐘

Static tanımlama ile sınıf örneği oluşturmadan o sınıfın static metot ve özelliklerine erişilebilir. Bu erişimi sağlamak için çift iki nokta erişecini kullanırız. (::) Fakat php şu anda sınıfların static "METOTLARINA" sınıf örneği oluşturarakta erişime izin vermektedir. Static metotlar ilk çağrıldığında ram'e aktarılır ve daha sonra ramden okunur, performans açısından kuvvetlidir.

<?php

class Test
{
    public static function selam()
    {
        return 'selam';
    }
}

//içerisinde static metot olan bir sınıfımız varsa 
echo Test::selam(); //new ile oluşturmadan bu şekilde metotu çağırabilirim

?>

Static metotlar içerisinde yalnızca sınıfın static özelliklerine erişim sağlanabilir.

<?php

class Test
{
    public static $b = 'test2';

    public static function test()
    {

        return self::$b;
    }
}

?>

Dosya yazma, okuma işlemlerini gerçekleştiren static metotlar yazalım ve bunlara hem sınıf örneği başlatarak hemde sınıf örneği kullanmadan erişelim:

<?php

class File
{
    public static $dosyaAdi;
    public static function Olustur($dosyaAdi,$icerik)
    {
        self::$dosyaAdi = $dosyaAdi;
        $dosya = fopen($dosyaAdi,'w+');
        fwrite($dosya,$icerik);
        fclose($dosya);
    }
    public static function Oku($dosyaAdi = null)
    {   
        if(!$dosyaAdi) $dosyaAdi = self::$dosyaAdi; 
        return file_get_contents($dosyaAdi);
    }
}
//sınıfın örneğini oluşturmadan
File::Olustur('a.txt','deneme içeriği');

//sınıf örneklenerek
$ds = new File;
echo $ds->Oku();

?>

Sınıf Sabitleri 🐘

Sınıf sabitleri tanımlanırken const ifadesi kullanılır. Değişkenler gibi tanımlanırken $ imi kullanılmaz. Sabitlerin değeri bir değişken,bir sınıfa ait özellik veya bir işlem olmamalıdır. Sınıf sabitleri "HER SINIF İÇİN BİR KERE AYRILIR", her sınıf örneği için ayrılmaz.

Örneğin File isminde bir sınıfımız olsun ve DIRECTORY isimli bir sabit içersin:

<?php
class File
{

    const DIRECTORY = __DIR__; // __DIR__ hangi dizinde ise bize onun ismini döndürür
    public function getDirectory()
    {
        return self::DIRECTORY; //dizin yolunu geri döndürür, self(sınıfı referans alır) ile eriştim
    }

}
?>

Geri dönen değeri ekranda görmek:

<?php
$file = new File;
echo $file->getDirectory();

//veya sınıfı başlatmadan da sabitin değerini alabiliriz

echo "<br>". File::DIRECTORY;
?>

Şimdi de Folder isimli bir sınıf tanımlayalım ve bu da File sınıfından türetilsin:

<?php
class Folder extends File
{
    public function getDirectory()
    {
        return parent::DIRECTORY; //File sınıfındaki DIRECTORY sabitini kullandım, parent(temel sınıfı)'ı baz aldım.
    }
}
?>

Dizin değerini geri döndürme işlemini Folder sınıfının nesnesi ile yapalım:

<?php
$folder = new Folder;
echo "<br>". $folder->getDirectory();
?>

Çıktımız şu şekilde olacaktır:

const-ifadesi

Sınıf Soyutlama 🐘

Sınıfın başına abstract deyimi getirilerek bu sağlanır. Soyut sınıflarda soyut metotların (soyut metotlar tanımlanırken yine abstract deyimini kullanırız) yanında soyut olmayan metotlar da kullanılabilmektedir. Bu özelliği ile arayüzlerden ayrılır ve esneklik kazanır. Tanımladığımız başka bir sınıfı extends deyimi ile tanımlanan herhangi bir soyut sınıftan türetebiliriz. Türetilen bu sınıfta soyut sınıfta tanımlanan soyut metotlar bulunmak zorundadır. Soyut sınıflar başlatılamazlar, soyut sınıftan türettiğim normal sınıflarım ise başlatılabilirler. Soyut sınıfların soyut metotlarında sadece fonksiyon başlığı yazılır, fonksiyon gövdesi yazılmaz.

Örneğin PHP tabanlı bir CMS'e eklenti geliştirdiğimiz senaryoyu ele alalım bu basit ama anlaşılır bir örnek olacak. Eklenti isimli bir soyut sınıf tasarlayalım:

<?php
abstract class Eklenti //soyut sınıf
{
    abstract public function setTitle($title); //soyut metot, gövdesi yazılmaz, zorunluluk bildirir
    abstract public function setContent($content); //soyut metot, gövdesi yazılmaz, zorunluluk bildirir
    //normal metot 
    public function show()
    {
        echo '<h1>'.$this->title.'</h1>';
        echo '<p>'.$this->content.'</p>';
    }
}
?>

Sınıfın title ve content özelliklerini az sonra anlamlandıracağız, şimdi ise Eklenti isimli soyut sınıftan türeyen iki adet sınıf tanımlayalım.

SonYorumlar sınıfı:

<?php
class SonYorumlar extends Eklenti //soyut sınıftan türedi
{
    public function setTitle($title)
    {
        //özelliğin tanımı metot içinde yapıldı (title)
        $this->title = $title;
    }
    public function setContent($content)
    {
        //özelliğin tanımı metot içinde yapıldı (content)
        $this->content = $content;
    }
}
?>

SosyalMedya sınıfı:

<?php
class SosyalMedya extends Eklenti //soyut sınıftan türedi
{
    public function setTitle($title)
    {
        //özelliğin tanımı metot içinde yapıldı (title)
        $this->title = $title;
    }
    public function setContent($content)
    {
        //özelliğin tanımı metot içinde yapıldı (content)
        $this->content = $content;
    }
}
?>

Daha sonrasında bu iki sınıfımı başlatıyorum, title ve content özelliklerini set ediyorum:

<?php
//SonYorumlar sınıfını başlatıyorum
$sonyorumlar = new SonYorumlar;
//değerleri set edelim
$sonyorumlar->setTitle('Son Yorumlar');
$sonyorumlar->setContent('Son Yorumlar Burada Gözükecek');

//SosyalMedya sınıfını başlatıyorum
$sosyalmedya = new SosyalMedya;
//değerleri set edelim
$sosyalmedya->setTitle('Sosyal Medya');
$sosyalmedya->setContent('Sosyal Medya Bağlantıları Burada Gözükecek');
?>

Şimdi ise soyut sınıfımda tanımladığım ama soyut olmayan show() metodum ile set edilen özellikleri her bir nesnem için çağırıyorum:

<?php
echo $sonyorumlar->show();
echo "<br>";
echo $sosyalmedya->show();
?>

Çıktı şu şekilde olacaktır:

title-content

Arayüzler 🐘

Arayüz tanımlamak için interface deyimini kullanırız. Arayüzler soyut sınıflara benzer fakat bazı temel farklılıkları vardır. Öncelikli farkı arayüzlerin tüm erişim belirleyicileri public olmak zorundadır, soyut sınıflarda bu public, protected veya private olabilir.
Arayüzler soyut metotlar ve sabitler içerir, soyut sınıflar soyut metotlar,sabitler,normal metotlar ve özellikler içerir.
PHP dilinde arayüzlerin diğer dillerden bir farklılığı vardır, static metotları da içerebilir.
Arayüzler nesne olarak başlatılamazlar (new anahtar kelimesi ile).
Arayüzlerin içerisinde kurucu ve yıkıcı metotlar tanımlanabilir.
Arayüzler kendi içerisinde extends deyimi ile genişleyebilir Hatta birden fazla arayüz kalıtılabilir PHP de sıfılar arasında çoklu kalıtım desteklenmese de arayüzler arasında bu mümkündür.
Aynı sınıfta birden fazla arayüz kullanılabilir, fakat aynı sınıf sadece bir abstract sınıftan türeyebilir.

Örneğin Islem adında bir arayüz tanımlayalım:

<?php
interface Islem
{
    public function Olustur($tabloAdi,$id);
    public function Oku($tabloAdi,$id);
    public function Guncelle($tabloAdi,$veri,$id);
    public function Sil($tabloAdi,$id);
}
?>

Bundan farklı olarak birde VT adında bir arayüz tanımlayalım:

<?php
interface VT 
{
    public function baglan($host,$dbname,$kadi,$sifre);
}
?>

Şimdi ise Veritabani sınıfımıza bu arayüzleri implement edelim:

<?php
class VeriTabani implements Islem,VT
{
    public function baglan($host,$dbname,$kadi,$sifre)
    {

    }

    public function Olustur($tabloAdi,$id)
    {

    }
    public function Oku($tabloAdi,$id)
    {

    }
    public function Guncelle($tabloAdi,$veri,$id)
    {
        
    }
    public function Sil($tabloAdi,$id)
    {

    }
}
?>

Görüldüğü üzere arayüzlerde tanımlanan fonksiyonların hepsi implemente edilen VeriTabani sınıfında kullanıldı, eğer bu fonksiyonları VeriTabani sınıfında yazmasaydık hata alırdık. Fonksiyonların başında herhangi bir abstract deyimi yer almasada arayüzlerde tanımlanan fonksiyonlar soyut fonksiyon olarak tanımlandı.

PHP de çoklu arayüz kullanımı ve multi-inheritance istisnası:

<?php
interface x
{
    public function basX();
}

interface y
{
    public function basY();
}

interface z extends x,y
{
    public function basZ();
}

class Test implements z
{
    public function basX()
    {
        
    }
    public function basY()
    {
        
    }
    public function basZ()
    {

    }
}
?>

İsim Uzayları 🐘

Birden çok geliştiricisi olan bir projenin kütüphaneleri yazılırken aynı isimli sınıflar oluşturulmuş olabilir. Biz bu sınıfları kullanmak istediğimizde uygulamamız hangi kütüphanedeki sınıfı çağırması gerektiğini bilemez ve fatal error benzeri sorunlar ile karşılaşırız.Bu ve bunun gibi hataların önüne geçmek için isim uzaylarını kullanmamız gerekmektedir. Aynı isimli iki sınıfı farklı isim uzayları altında tanımlar ve bu isime göre sınıfımızı çağırırsak karışıklık ortadan kalkar ve modülerlik artar.

İsim uzayı tanımlayabilmek için namespace deyimini kullanmamız gerekmektedir.Örneğin iki tane sınıf yazalım ve bu iki sınıfımızın ismi de Bildirimler olsun. Bir tanesi Uygulama klasörünün altındaki Helper klasörü altında diğeri ise Uygulama klasörünün altındaki Controller klasöründe yazılmış olsun.

İsim uzayları tanımlanırken okunabilirliği artırmak için içinde bulunduğu klasör dizin yapısına göre isimlendirilmesi büyük kolaylık sağlayacaktır. Örneğin;

<?php
namespace Uygulama\Helper;
?>

ve

<?php
namespace Uygulama\Controller;
?>

gibi tanımlamalar yapabiliriz. Burada aslında bir klasör eşleşmesi yoktur, sınıfları gerçeklerken kolaylık olsun ve anlaşılır olsun diye isim uzaylarımızı böyle isimlendirdik.

ve şimdi bu isim uzayları içerisinde sınıflarımızı tanımlayalım iki sınıfımızın ismi de Bildirimler olsun.

uygulama->controller altındaki Bildirimler sınıfı:

<?php
namespace Uygulama\Controller;

class Bildirimler
{
    public function __construct()
    {
        echo 'Controller İçin Bildirimler oluşturuldu!';
    }
}
?>

uygulama->helper altındaki Bildirimler sınıfı:

<?php
namespace Uygulama\Helper;

class Bildirimler
{
    public function __construct()
    {
        echo 'Helper İçin Bildirimler oluşturuldu!';
    }
}
?>

Uygulama içerisindeki index.php içerisinde bu iki sınıfı gerçekleyelim bunu use deyimini kullanarak yapabiliriz.

<?php
// use deyimini kullanarakta yapabilirim
use Uygulama\Controller\Bildirimler; // use namespaceismi\sınıfismi;
$controllerBildirim = new Bildirimler
?>

veya use deyimini kullanmayarak, direk nesne oluştururken isim uzayını sınıf isminin başına ekleyerekte bunu sağlayabilirim.

<?php
//veya şöyle bir kullanımda yapabilirim
$helperBildirim = new Uygulama\Helper\Bildirimler;
?>

index.php dosyasının son hali :

<?php
require __DIR__.'/controller/bildirimler.php';
require __DIR__.'/helper/bildirimler.php';

// use deyimini kullanarakta yapabilirim
use Uygulama\Controller\Bildirimler; // use namespaceismi\sınıfismi;
$controllerBildirim = new Bildirimler;

echo '<br>';

//veya şöyle bir kullanımda yapabilirim
$helperBildirim = new Uygulama\Helper\Bildirimler;

?>

çıktımız ise şu şekilde olacaktır:

controller-helper

php's People

Contributors

yenilikci avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.