{"id":20632968,"url":"https://github.com/yenilikci/php","last_synced_at":"2025-04-15T19:04:11.822Z","repository":{"id":117874048,"uuid":"240721917","full_name":"yenilikci/php","owner":"yenilikci","description":"PHP, PDO ve OOP notları.","archived":false,"fork":false,"pushed_at":"2020-05-16T23:27:31.000Z","size":153,"stargazers_count":12,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-15T19:03:32.933Z","etag":null,"topics":["oop","pdo","pdo-mysql","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yenilikci.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-02-15T14:00:03.000Z","updated_at":"2023-03-28T06:58:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"90358b3e-c309-4291-9e0f-9b5ec29b17e0","html_url":"https://github.com/yenilikci/php","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2Fphp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2Fphp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2Fphp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yenilikci%2Fphp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yenilikci","download_url":"https://codeload.github.com/yenilikci/php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249135815,"owners_count":21218365,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["oop","pdo","pdo-mysql","php"],"created_at":"2024-11-16T14:18:00.124Z","updated_at":"2025-04-15T19:04:11.805Z","avatar_url":"https://github.com/yenilikci.png","language":"PHP","readme":"# PHP\n## Başlıklar\n\n\n* [PDO](https://github.com/yenilikci/php#pdo \"PDO\")\n  * [Veritabanı Bağlantısı](https://github.com/yenilikci/php#veritaban%C4%B1-ba%C4%9Flant%C4%B1s%C4%B1-- \"Veritabanı Bağlantısı\")\n  * [Veri Ekleme (INSERT)](https://github.com/yenilikci/php#veri-ekleme-insert- \"Veri Ekleme (INSERT)\")\n  * [Veri Listeleme (SELECT](https://github.com/yenilikci/php#veri-listeleme-select- \"Veri Listeleme (SELECT\")) \n  * [Veri Güncelleme (UPDATE)](https://github.com/yenilikci/php#veri-g%C3%BCncelleme-update- \"Veri Güncelleme (UPDATE)\")\n  * [Veri Silme (DELETE) ](https://github.com/yenilikci/php#veri-silme-delete- \"Veri Silme (DELETE)\")\n  * [Birleştirici (JOIN) Kullanımı](https://github.com/yenilikci/php#birle%C5%9Ftirici-join-kullan%C4%B1m%C4%B1- \"Birleştirici (JOIN) Kullanımı\")\n  * [Arama İşlemi (LIKE) Kulanımı](https://github.com/yenilikci/php#arama-i%CC%87%C5%9Flemi-like-kulan%C4%B1m%C4%B1- \"Arama İşlemi (LIKE) Kulanımı\") \n* [OOP](https://github.com/yenilikci/php#pdo \"PDO\")\n  * [Sınıflar](https://github.com/yenilikci/php#s%C4%B1n%C4%B1flar- \"Sınıflar\")\n  * [Görünürlük](https://github.com/yenilikci/php/blob/master/README.md#g%C3%B6r%C3%BCn%C3%BCrl%C3%BCk- \"Görünürlük\")\n  * [Kurucu ve Yıkıcı Metot](https://github.com/yenilikci/php/blob/master/README.md#kurucu-ve-y%C4%B1k%C4%B1c%C4%B1-metot- \"Kurucu ve Yıkıcı Metot\")\n  * [Kalıtım](https://github.com/yenilikci/php/blob/master/README.md#kal%C4%B1t%C4%B1m- \"Kalıtım\")\n  * [Static Deyimi](https://github.com/yenilikci/php#static-deyimi- \"Static Deyimi\")\n  * [Sınıf Sabitleri](https://github.com/yenilikci/php#s%C4%B1n%C4%B1f-sabitleri- \"Sınıf Sabitleri\")\n  * [Sınıf Soyutlama](https://github.com/yenilikci/php#s%C4%B1n%C4%B1f-soyutlama- \"Sınıf Soyutlama\")\n  * [Arayüzler](https://github.com/yenilikci/php#aray%C3%BCzler- \"Arayüzler\")\n  * [İsim Uzayları](- \"İsim Uzayları\")\n\n\n## PDO\n**Veritabanı adı:** *veri*\n\n**Tablo adı:** *veriler*\n| id | baslik  |icerik|onay|tarih|\n| --- | --- | --- | --- | ---|\n| 1  |  pdo1 | pdo ile veritabani1 | 1|2020-02-15 22:24:39\n| 2  |  pdo2 | pdo ile veritabani2 | 1|2020-02-15 22:25:39\n| 3  |  pdo3 | pdo ile veritabani3 | 1|2020-02-15 22:26:39\n| 4  |  pdo4 | pdo ile veritabani4 | 1|2020-02-15 22:27:39\n| 5  |  pdo5 | pdo ile veritabani5 | 1|2020-02-15 22:28:39\n\n### Veritabanı Bağlantısı  [🐘](https://github.com/yenilikci/php/blob/master/PDO/baglan.php \"🐘\")\n```php\n\u003c?php\n    try\n    {\n\t//PDO Nesnesi. Parametreler: dsn,username,passwd\n        $db = new PDO('mysql:host=localhost;dbname=veri','root',''); \n    }\n    catch (PDOException $e)\n    {\n        //bağlantı başarısız olursa hatayı yakalayıp bilgi alıyoruz.\n        $e -\u003e getMessage();\n    }\n?\u003e\n```\n### Veri Ekleme (INSERT) [🐘](https://github.com/yenilikci/php/blob/master/PDO/formInsert.php \"🐘\")\n```sql\nINSERT INTO Tablo_Adi SET kolon1 = değer1;\n```\n```php\n//veriler tablosuna ekleme işlemi\n$sorgu = $db -\u003e prepare('INSERT INTO veriler SET\n        baslik = ?,\n        icerik = ?,\n        onay = ?');\n\n//baslik,icerik ve onayı işlem dizisine koyuyorum.\n$ekle = $sorgu -\u003e execute([\n        $baslik,\n        $icerik,\n        $onay\n        ]);\n\n//eğer ekleme işlemi başarılıysa\nif ($ekle)\n        {\n            //yönlendirme işlemi yapıyorum.\n            header('Location:index.php');\n        } \nelse \n        {\n            //değilse hata mesajını alıp ekrana basıyoruz.\n            $hata = $sorgu -\u003e errorInfo();\n            echo \"MySQL Hatası: \".$hata[2];\n        }\n```\n### Veri Listeleme (SELECT) 🐘\n```sql\nSELECT * FROM Tablo_Adi WHERE id = ?;\n```\n```php\n//veriler tablosundan id'si =\n$sorgu = $db -\u003e prepare('SELECT * FROM veriler WHERE id=?');\n$sorgu -\u003e execute([\n    //get edilen id'ye eşit olanı al\n    $_GET['id']\n]);\n\n//zaten tek bir veri alacağız o yüzden fetch() kullandım. (o id'ye ait olan)\n$veri = $sorgu -\u003e fetch(PDO::FETCH_ASSOC)\n```\n### Veri Güncelleme (UPDATE) [🐘](https://github.com/yenilikci/php/blob/master/PDO/formUpdate.php \"🐘\")\n```sql\nUPDATE Tablo_Adi SET kolon1 = değer1 WHERE kolon=değer;\n```\n```php\n  $sorgu = $db-\u003eprepare('UPDATE veriler SET\n                baslik = ?,\n                icerik = ?,\n                onay = ?\n                WHERE id = ?'); //id'si şu olan...\n\n//sorgu değişkenimi execute ediyorum ve güncelle değişkenine atıyorum.\n  $guncelle = $sorgu-\u003eexecute([\n                $baslik, $icerik, $onay, $veri['id']\n            ]);\n\t    \n//eğer güncelleme başarılıysa\nif ($guncelle) \n{\n\theader('Location:index.php?sayfa=oku\u0026id=' . $veri['id']);\n} \nelse\n{\n\techo \"Güncelleme işlemi başarısız!\";\n}\n```\n### Veri Silme (DELETE) [🐘](https://github.com/yenilikci/php/blob/master/PDO/sil.php \"🐘\")\n```sql\nDELETE FROM Tablo_Adi WHERE id = 2;\n```\n```php\n$sorgu = $db -\u003e prepare('DELETE FROM veriler WHERE id = ?'); //veriler tablosunda id'si...\n\n$sorgu -\u003e execute([\n    $_GET['id'] //... şu olan veriyi sil\n]);\n\n//daha sonra index.php'ye yönlendir.\nheader('Location:index.php');\n```\n\n\u003e Şimdi ise verilerimizi ilişkilendirebilmek için \"**verikategorisi**\" isimli bir tablo daha oluşturuyoruz.\n\n**Veritabanı adı:** *veri* (aynı veritabanında çalışıyoruz)\n\n**Tablo adı:** *verikategorisi*\n\n| id | ad  |\n| --- | --- |\n| 1  |  php |\n| 2  |  asp.net core | \n| 3  |  nodejs | \n| 4  |  django |\n\nbununla birlikte **veriler** tablomuza verikategorisi tablosunun id'si ile eşleştireceğimiz **kategori_id** kolonunu ekliyoruz.\n\n\n| id | baslik  |icerik |kategori_id|onay|tarih|\n| --- | --- | --- | --- | ---|---|\n| 1  |  pdo1 | pdo ile veritabani1 | 1|1|2020-02-15 22:24:39\n| 2  |  pdo2 | pdo ile veritabani2 |1| 1|2020-02-15 22:25:39\n| 3  |  pdo3 | pdo ile veritabani3 | 1|1|2020-02-15 22:26:39\n| 4  |  pdo4 | pdo ile veritabani4 | 1|1|2020-02-15 22:27:39\n| 5  |  pdo5 | pdo ile veritabani5 | 1|1|2020-02-15 22:28:39\n\n### Birleştirici (JOIN) Kullanımı [🐘](https://github.com/yenilikci/php/blob/master/PDO/homepage.php \"🐘\")\n```sql\nINNER JOIN Tablo_Adi ON Tablo_Adi.id = digerTablo_Adi.id;\n```\nInner Join ile ortak değere sahip iki tablodaki ilişkili değerleri seçelim ve birleştirelim.\n\u003e Query içinde kullanımı:\n\n```sql\nSELECT veriler.id , veriler.baslik , verikategorisi.ad AS kategori_adi , veriler.onay FROM veriler\nINNER JOIN verikategorisi ON verikategorisi.id = veriler.kategori_id\nORDER BY veriler.id DESC;\n```\nfetchAll() ile bu verileri çektiğimizi ve $veriler isimli bir değişkene atadığımızı varsayalım.\n\n```php\n\u003c?php if ($veriler): ?\u003e\n        \u003cul\u003e\n        \u003c!-- foreach ile veriler çekiliyor $veriler as $vr--\u003e\n    \u003c?php foreach ($veriler as $vr): ?\u003e\n        \u003cli\u003e\n            \u003c!--İçeriklerin başlıkları ve kategorileri listelendi--\u003e\n            \u003c?php echo $vr['baslik']; ?\u003e\n            (\u003c?php echo $vr['kategori_adi']; ?\u003e)\n            \u003cdiv\u003e\n              \u003c?php if($vr['onay'] == 1): ?\u003e\n                  \u003c!--Sadece onaylı olan içeriklerin başlıkları gösterilecek.--\u003e\n                  \u003ca href=\"index.php?sayfa=oku\u0026id=\u003c?php echo $vr['id'];?\u003e\"\u003e[OKU]\u003c/a\u003e\n              \u003c?php endif; ?\u003e\n              \u003ca href=\"index.php?sayfa=formUpdate\u0026id=\u003c?php echo $vr['id'] ?\u003e\"\u003e[DÜZENLE]\u003c/a\u003e\n              \u003ca href=\"index.php?sayfa=sil\u0026id=\u003c?php echo $vr['id'] ?\u003e\"\u003e[SİL]\u003c/a\u003e\n          \u003c/div\u003e\n        \u003c/li\u003e\n    \u003c?php endforeach;?\u003e\n        \u003c/ul\u003e\n\u003c?php else: ?\u003e\n    \u003c!--veri yoksa...--\u003e\n    \u003cdiv\u003eHenüz eklenmiş veri bulunmuyor!\u003c/div\u003e\n\u003c?php endif; ?\u003e\n```\n#### Left Join\n```sql\nSELECT * FROM Tablo_Adi LEFT JOIN digerTablo_Adi ON Tablo_adi.id = digerTablo_Adi.id;\n```\nSol tablodaki tüm satırları ve koşula uygun olan sağ tablodaki satırları seçip birleştirelim ve bunları gruplayalım.\n\u003e Query içinde kullanımı:\n\n```sql\nSELECT verikategorisi.* , COUNT(veriler.id) AS toplamVeri \nFROM verikategorisi\nLEFT JOIN veriler ON veriler.kategori_id = verikategorisi.id\nGROUP BY verikategorisi.id\n```\nfetchAll() ile bu verileri çektiğimizi ve $kategori isimli bir değişkene atadığımızı varsayalım.\n\n```php\n\u003cul\u003e\n    \u003c?php foreach ($kategori as $kt): ?\u003e\n    \u003cli\u003e\n        \u003ca href=\"index.php?sayfa=kategori\u0026id=\u003c?php echo $kt['id'];?\u003e\"\u003e\n            \u003c?php echo $kt['ad']; ?\u003e\n            (\u003c?php echo $kt['toplamVeri']; ?\u003e)\n        \u003c/a\u003e\n    \u003c/li\u003e\n    \u003c?php endforeach; ?\u003e\n\u003c/ul\u003e\n```\n### Arama İşlemi (LIKE) Kulanımı [🐘](https://github.com/yenilikci/php/blob/master/PDO/homepage.php \"🐘\")\n```sql\nSELECT * FROM Tablo_Adi WHERE Kolon_Adi LIKE \"%a%\";\n```\nLIKE komutu WHERE komutu ile birlikte bir kolonda ilgili değeri aramak için kullanılır.\n\n####  Joker Karakterler:\n##### * Birden fazla bilinmeyen karakteri sorgulatacaksak kullanırız. \n##### # Bilinmeyen tek rakam için kullanırız.\n##### ? Bilinmeyen tek karakter için kullanırız.\n\n\u003e Query içinde kullanımı:\n\n```php\n\u003c?php\n\n$sql = ' SELECT veriler.id,veriler.baslik,verikategorisi.ad as kategori_adi,veriler.onay FROM veriler\nINNER JOIN verikategorisi ON verikategorisi.id = veriler.kategori_id'; \n//sql sorgumu değişkene atadım\n\nif (isset($_GET['arama'])) //eğer bir arama yapılmışsa\n{\n    //bu ifadeyi de sql ifademe dahil edeceğim:\n    $sql .= ' WHERE veriler.baslik LIKE \"%' . $_GET['arama'] . '%\" || veriler.icerik LIKE \"%' . $_GET['arama'] . '%\" ';\n}\n$sql .= ' ORDER BY veriler.id DESC';\n\n\n$veriler = $db-\u003equery($sql)-\u003efetchAll(PDO::FETCH_ASSOC);\n//son eklenen verilere göre listele\n\n?\u003e\n\n```\n## OOP\n### Sınıflar [🐘](https://github.com/yenilikci/php/blob/master/OOP/sinif.php \"🐘\")\nBir sınfı tanımlamak için class anahtar kelimesi kullanılır ve ardından sınıfın özel ismi yazılır.\nSınıflar isimlendirilirken barındıracağı özellikler neticesinde ve yerine getireceği işlevler düşünülerek isimlendirme yapılması mantıklı olandır.\nİsimlendirme yapılırken türkçe karakter kullanımına izin vermektedir.\nHarf veya alt çizgi ile sınıf ismini başlatabiliriz.\n\n**Örnek Sınıf Kullanımı:**\n```php\n\u003c?php\nclass Uye\n{ \n    public $ad = 'Melih'; //özellik tanımlamaları\n    public $soyad = 'Celik';\n    const DOGUMTARIHI = 1999; //sabit tanımı\n    \n    //başına public koyulmaz ise varsayılan olarak public atanır\n    function stringAdDondur()\n    {\n        return 'Melih';\n    }\n\n    public function stringSoyadDondur()\n    {\n        return 'Celik';\n    }\n\n    //geriye değer döndüren parametreli fonksiyon\n    public function kacYasinda($gunumuz,$dogumTarihi)\n    {   \n        return $gunumuz - $dogumTarihi;\n    }\n\n    //ö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.\n    function adDondur()\n    {\n        return $this-\u003ead;\n    }\n    function soyadDondur()\n    {\n        return $this-\u003esoyad;\n    }\n\n    //fonksiyon içerisinde fonksiyonumuzu döndürmek isteseydik\n    function yasBas()\n    {\n        return $this-\u003ekacYasinda(2020,$this::DOGUMTARIHI);\n    }\n    \n    //sabiti geriye döndürmek\n    function dogumTarihi()\n    {\n        return $this::DOGUMTARIHI;\n    }//veya self kullanabiliriz\n    function dogumTarihi2()\n    {\n        return self::DOGUMTARIHI;\n    }\n}\n?\u003e\n```\n**Şimdi bu sınıftan nesneler türetelim**\n```php\n\u003c?php\n//sınıftan nesne olusturma\n$uye = new Uye();\n//veya \n$uye2 = new Uye;\n?\u003e\n```\n**nesnelerimiz ile bu sınıfın özellik ve metotlarına erişelim:**\n\n\u003e Sınıf içerisindeki özelliklere ve metotlara erişmek için -\u003e işareti kullanılır\n\nMetotlara erişmek ve ekrana yazdırmak\n```php\necho $uye-\u003estringAdDondur() . \"\u003cbr\u003e\";\n```\nÖzelliğe erişmek ve ekrana yazdırmak\n```php\necho $uye-\u003esoyad . \"\u003cbr\u003e\" ;\n```\nSabite erişmek ve ekrana yazdırmak\n```php\necho $uye::DOGUMTARIHI;\n```\nuye2 için özelliklere farklı değerler atayalım\n```php\n$uye2-\u003ead = 'Farklıİsim';\n$uye2-\u003esoyad = 'FarkliSoyad';\n```\n\nuye2'nin değerlerini ekrana yazalım\n```php\n\u003c?php\necho \"\u003chr\u003e\";\necho \"\u003cbr\u003e\". $uye2-\u003ead;\necho \"\u003cbr\u003e\". $uye2-\u003esoyad;\necho \"\u003cbr\u003e\". $uye2::DOGUMTARIHI;\n?\u003e\n```\nParametreli metodu çağırmak\n```php\n\u003c?php\necho \"\u003chr\u003e\";\necho \"KAÇ YAŞINDALAR?\" . \"\u003cbr\u003e\";\necho $uye-\u003ekacYasinda(2020,$uye::DOGUMTARIHI);\n?\u003e\n```\nÖzellik ve fonksiyonları geri döndüren fonskiyonları çağırmak \n```php\n\u003c?php\necho \"\u003chr\u003e\";\necho \"Birde özellikleri geri döndürerek ad ve soyadı ekrana bastıralım\" . \u003cbr\u003e\";\necho $uye-\u003eadDondur() . \"\u003cbr\u003e\";\necho $uye-\u003esoyadDondur().\"\u003cbr\u003e\";\necho \"\u003cbr\u003e\". \"Birde metodu geri döndürerek yaşı ekrana bastıralım\" . \"\u003cbr\u003e\";\necho $uye-\u003eyasBas().\"\u003cbr\u003e\";\n?\u003e\n```\n\u003e this nesneyi referans alır,self ise sınıfı referans alır\n\nThis ve self ile sabit döndüren fonksiyonların ekrana bastırılması\n```php\n\u003c?php\necho $uye-\u003edogumTarihi().\"\u003cbr\u003e\"; //this kullanıldı\necho $uye-\u003edogumTarihi2(); //self kullanıldı\n?\u003e\n```\nÇıktı\n\n![php-sınıf-çıktı](https://user-images.githubusercontent.com/57464067/81638248-33ac8f80-9421-11ea-9578-f81f5bb55961.png)\n\n### Görünürlük [🐘](https://github.com/yenilikci/php/blob/master/OOP/gorunurluk.php \"🐘\")\nBir özellik, sabit ya da metodun görünürlüğünü üç farklı şekilde belirleyebiliriz.\nKullanımlara örnek sınıf üzerinden bakacak olursak:\n```php\n\u003c?php\nclass Test\n{\n    public $a = 'a'; //her yerden erişilebilir.\n\n    private $b = 'b'; //sadece sınıf içerisinden erişilebilir\n\n    public function geriDonB()\n    {\n        return $this-\u003eb; //private özelliği public metotta geriye döndürebilirim\n    }\n\n    protected $c = 'c';\n    //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\n\n    private function geriDonA() //private func\n    {\n        return $this-\u003ea;\n    }\n\n    protected function geriDonC() //protected func\n    {\n        return $this-\u003ec;\n    }\n}\n?\u003e\n```\n\nŞimdi bu özellik ve metotları ekrana bastırmaya çalışalım\n```php\n\u003c?php\n$test = new Test;\n\necho $test-\u003ea; //bu özelliğe rahatça ekrana basabildim\n\necho $test-\u003eb; //bu özelliği ekrana bastırmak istediğimde hata ile karşılaşıyorum\n\necho $test-\u003egeriDonB(); //private özelliği public fonksiyon ile bastırdım\n\necho $test-\u003ec; //hata\n\necho $test-\u003egeriDonA(); //hata\n\necho $test-\u003egeriDonC(); //hata\n?\u003e\n```\n### Kurucu ve Yıkıcı Metot [🐘](https://github.com/yenilikci/php/blob/master/OOP/kurucuyikici.php \"🐘\")\n\nKurucu metot bir sınıf başlatıldığında otomatik olarak çağrılacak fonksiyondur.\n```php\n\u003c?php\n    public function __construct($a)\n    {\n\t\t\t.\t\t.\t\t.\n    }\n?\u003e\n```\n\nYıkıcı metot bir sınıfın çalışması bittiğinde çalışacak son metot.\n```php\n\u003c?php\n    public function __destruct()\n    {\n\t\t\t.\t\t.\t\t.\n    }\n?\u003e\n```\n\nÖrneğin;\n```php\n\u003c?php\n\nclass YapYik\n{\n    private $degisken;\n\n    //parametreli kurucu metot\n    public function __construct($a)\n    {\n        $this-\u003edegisken = $a;\n        echo $this-\u003edegisken.PHP_EOL;\n    }\n\n    public function bas()\n    {\n        echo 'ekrana yazı bastım'.PHP_EOL;\n    }\n\n    //yıkıcı metot\n    public function __destruct()\n    {\n        echo 'yıkıcı metot çalıştı'.PHP_EOL;\n    }\n\n}\n \n$nesne = new YapYik('Kurucu metot çalıştı');\n$nesne-\u003ebas();\n\n?\u003e\n```\nÇıktı\n\n![çıktı](https://user-images.githubusercontent.com/57464067/81704814-f377fc00-9476-11ea-9aed-2387e4953b53.png)\n\n### Kalıtım [🐘](https://github.com/yenilikci/php/blob/master/OOP/kalitim.php \"🐘\")\n\nKalıtım sınıf ve nesne ilişkilerini düzenleyen iyi kurgulanmış bir prensiptir.\nTüreyen sınıflar ,türetilen sınıfların özellik ve metotlarını public ve protected olduğu sürece kullanabilirler.\nGenişletmek için extends deyimi kullanılır.\n\nÖrnek bir temel(base) - ebeveyn(parent) sınıf :\n```php\n\u003c?php\nclass Calisan\n{\n    public $maas;\n    public $adsoyad;\n\n    public function setAdSoyad($adsoyad)\n    {\n        //sınıfın içerisindeki adsoyad dışarıdan gelen adsoyad değerine eşit olsun\n        $this-\u003eadsoyad = $adsoyad;\n    }\n\n    public function maas($maas)\n    {\n        //sınıfın içerisinde maas dışarıdan gelen maas değerine eşit olsun\n        $this-\u003emaas = $maas;\n    }\n\n    public function senelikMaas()\n    {\n        return ($this-\u003emaas*12).'₺';\n    }\n}\n?\u003e\n```\n\nCalisan sınıfından türetilen Muhasebe sınıfı:\n```php\n\u003c?php\nclass Muhasebe extends Calisan{}\n?\u003e\n```\nCalisan sınıfından türetilen IT sınıfı:\n\u003e 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\n```php\n\u003c?php\nclass IT extends Calisan{\n    public function senelikMaas()\n    {\n        return 'IT Çalışanı: '.$this-\u003eadsoyad.' senelik maaş olarak '.parent::senelikMaas();\n    }\n}\n?\u003e\n```\n\nZincirleme 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:\n```php\n\u003c?php\nclass x\n{\n    public function bas()\n    {\n        return 'x:bas';\n    }\n}\nclass y extends x\n{\n    public function bas()\n    {\n        return 'y:bas';\n    }\n}\nclass z extends y\n{\n    public function bas()\n    {\n        return 'z:bas';\n    }\n    public function basGetir()\n    {\n        return [\n            'z' =\u003e self::bas(),\n            'y' =\u003e parent::bas(),\n            'x' =\u003e x::bas()\n        ];\n    }\n}\n\n$z = new z;\nprint_r($z-\u003ebasGetir());\n?\u003e\n```\n### Static Deyimi [🐘](https://github.com/yenilikci/php/blob/master/OOP/staticornek.php \"🐘\")\n\nStatic tanımlama ile sınıf örneği oluşturmadan o sınıfın static metot ve özelliklerine erişilebilir.\nBu erişimi sağlamak için çift iki nokta erişecini kullanırız. (::)\nFakat php şu anda sınıfların static \"METOTLARINA\" sınıf örneği oluşturarakta erişime izin vermektedir.\nStatic metotlar ilk çağrıldığında ram'e aktarılır ve daha sonra ramden okunur, performans açısından kuvvetlidir.\n\n```php\n\u003c?php\n\nclass Test\n{\n    public static function selam()\n    {\n        return 'selam';\n    }\n}\n\n//içerisinde static metot olan bir sınıfımız varsa \necho Test::selam(); //new ile oluşturmadan bu şekilde metotu çağırabilirim\n\n?\u003e\n```\nStatic metotlar içerisinde yalnızca sınıfın static özelliklerine erişim sağlanabilir.\n\n```php\n\u003c?php\n\nclass Test\n{\n    public static $b = 'test2';\n\n    public static function test()\n    {\n\n        return self::$b;\n    }\n}\n\n?\u003e\n```\nDosya 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:\n\n```php\n\u003c?php\n\nclass File\n{\n    public static $dosyaAdi;\n    public static function Olustur($dosyaAdi,$icerik)\n    {\n        self::$dosyaAdi = $dosyaAdi;\n        $dosya = fopen($dosyaAdi,'w+');\n        fwrite($dosya,$icerik);\n        fclose($dosya);\n    }\n    public static function Oku($dosyaAdi = null)\n    {   \n        if(!$dosyaAdi) $dosyaAdi = self::$dosyaAdi; \n        return file_get_contents($dosyaAdi);\n    }\n}\n//sınıfın örneğini oluşturmadan\nFile::Olustur('a.txt','deneme içeriği');\n\n//sınıf örneklenerek\n$ds = new File;\necho $ds-\u003eOku();\n\n?\u003e\n```\n### Sınıf Sabitleri [🐘](https://github.com/yenilikci/php/blob/master/OOP/sabit.php \"🐘\")\n\nSınıf sabitleri tanımlanırken **const** ifadesi kullanılır. Değişkenler gibi tanımlanırken $ imi kullanılmaz. \nSabitlerin 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.\n\nÖrneğin File isminde bir sınıfımız olsun ve DIRECTORY isimli bir sabit içersin:\n```php\n\u003c?php\nclass File\n{\n\n    const DIRECTORY = __DIR__; // __DIR__ hangi dizinde ise bize onun ismini döndürür\n    public function getDirectory()\n    {\n        return self::DIRECTORY; //dizin yolunu geri döndürür, self(sınıfı referans alır) ile eriştim\n    }\n\n}\n?\u003e\n```\nGeri dönen değeri ekranda görmek:\n```php\n\u003c?php\n$file = new File;\necho $file-\u003egetDirectory();\n\n//veya sınıfı başlatmadan da sabitin değerini alabiliriz\n\necho \"\u003cbr\u003e\". File::DIRECTORY;\n?\u003e\n```\nŞimdi de Folder isimli bir sınıf tanımlayalım ve bu da File sınıfından türetilsin:\n```php\n\u003c?php\nclass Folder extends File\n{\n    public function getDirectory()\n    {\n        return parent::DIRECTORY; //File sınıfındaki DIRECTORY sabitini kullandım, parent(temel sınıfı)'ı baz aldım.\n    }\n}\n?\u003e\n```\nDizin değerini geri döndürme işlemini Folder sınıfının nesnesi ile yapalım:\n```php\n\u003c?php\n$folder = new Folder;\necho \"\u003cbr\u003e\". $folder-\u003egetDirectory();\n?\u003e\n```\nÇıktımız şu şekilde olacaktır:\n\n![const-ifadesi](https://user-images.githubusercontent.com/57464067/81931351-9f922200-95f2-11ea-88fa-a8cecf8906b8.png)\n\n### Sınıf Soyutlama [🐘](https://github.com/yenilikci/php/blob/master/OOP/soyutlama.php \"🐘\")\n\nSı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.\nBu ö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.\nSoyut 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.\n\nÖrneğin PHP tabanlı bir CMS'e eklenti geliştirdiğimiz senaryoyu ele alalım bu basit ama anlaşılır bir örnek olacak.\nEklenti isimli bir soyut sınıf tasarlayalım:\n\n```php\n\u003c?php\nabstract class Eklenti //soyut sınıf\n{\n    abstract public function setTitle($title); //soyut metot, gövdesi yazılmaz, zorunluluk bildirir\n    abstract public function setContent($content); //soyut metot, gövdesi yazılmaz, zorunluluk bildirir\n    //normal metot \n    public function show()\n    {\n        echo '\u003ch1\u003e'.$this-\u003etitle.'\u003c/h1\u003e';\n        echo '\u003cp\u003e'.$this-\u003econtent.'\u003c/p\u003e';\n    }\n}\n?\u003e\n```\nSı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.\n\nSonYorumlar sınıfı:\n```php\n\u003c?php\nclass SonYorumlar extends Eklenti //soyut sınıftan türedi\n{\n    public function setTitle($title)\n    {\n        //özelliğin tanımı metot içinde yapıldı (title)\n        $this-\u003etitle = $title;\n    }\n    public function setContent($content)\n    {\n        //özelliğin tanımı metot içinde yapıldı (content)\n        $this-\u003econtent = $content;\n    }\n}\n?\u003e\n```\nSosyalMedya sınıfı:\n```php\n\u003c?php\nclass SosyalMedya extends Eklenti //soyut sınıftan türedi\n{\n    public function setTitle($title)\n    {\n        //özelliğin tanımı metot içinde yapıldı (title)\n        $this-\u003etitle = $title;\n    }\n    public function setContent($content)\n    {\n        //özelliğin tanımı metot içinde yapıldı (content)\n        $this-\u003econtent = $content;\n    }\n}\n?\u003e\n```\n\nDaha sonrasında bu iki sınıfımı başlatıyorum, title ve content özelliklerini set ediyorum:\n```php\n\u003c?php\n//SonYorumlar sınıfını başlatıyorum\n$sonyorumlar = new SonYorumlar;\n//değerleri set edelim\n$sonyorumlar-\u003esetTitle('Son Yorumlar');\n$sonyorumlar-\u003esetContent('Son Yorumlar Burada Gözükecek');\n\n//SosyalMedya sınıfını başlatıyorum\n$sosyalmedya = new SosyalMedya;\n//değerleri set edelim\n$sosyalmedya-\u003esetTitle('Sosyal Medya');\n$sosyalmedya-\u003esetContent('Sosyal Medya Bağlantıları Burada Gözükecek');\n?\u003e\n```\nŞ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:\n```php\n\u003c?php\necho $sonyorumlar-\u003eshow();\necho \"\u003cbr\u003e\";\necho $sosyalmedya-\u003eshow();\n?\u003e\n```\nÇıktı şu şekilde olacaktır:\n\n![title-content](https://user-images.githubusercontent.com/57464067/81936930-9194cf00-95fb-11ea-87ac-a28366bfefa3.png)\n\n### Arayüzler [🐘](https://github.com/yenilikci/php/blob/master/OOP/arayuz.php \"🐘\")\n\nArayü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.\nÖncelikli farkı **arayüz**lerin tüm erişim belirleyicileri **public** olmak zorundadır, **soyut sınıf**larda bu **public, protected veya private** olabilir. \u003cbr\u003e\n**Arayüzler** soyut metotlar ve sabitler içerir, **soyut sınıflar** soyut metotlar,sabitler,normal metotlar ve özellikler içerir. \u003cbr\u003e\n**PHP** dilinde **arayüzlerin** diğer dillerden bir farklılığı vardır, **static metotları da içerebilir**. \u003cbr\u003e\nArayüzler nesne olarak başlatılamazlar (new anahtar kelimesi ile). \u003cbr\u003e\nArayüzlerin içerisinde **kurucu** ve **yıkıcı** metotlar **tanımlanabilir**. \u003cbr\u003e\nArayü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. \u003cbr\u003e\nAynı sınıfta birden fazla **arayüz** kullanılabilir, fakat aynı sınıf sadece bir **abstract** sınıftan türeyebilir.\n\nÖrneğin Islem adında bir arayüz tanımlayalım:\n```php\n\u003c?php\ninterface Islem\n{\n    public function Olustur($tabloAdi,$id);\n    public function Oku($tabloAdi,$id);\n    public function Guncelle($tabloAdi,$veri,$id);\n    public function Sil($tabloAdi,$id);\n}\n?\u003e\n```\n\nBundan farklı olarak birde VT adında bir arayüz tanımlayalım:\n```php\n\u003c?php\ninterface VT \n{\n    public function baglan($host,$dbname,$kadi,$sifre);\n}\n?\u003e\n```\nŞimdi ise Veritabani sınıfımıza bu arayüzleri implement edelim:\n```php\n\u003c?php\nclass VeriTabani implements Islem,VT\n{\n    public function baglan($host,$dbname,$kadi,$sifre)\n    {\n\n    }\n\n    public function Olustur($tabloAdi,$id)\n    {\n\n    }\n    public function Oku($tabloAdi,$id)\n    {\n\n    }\n    public function Guncelle($tabloAdi,$veri,$id)\n    {\n        \n    }\n    public function Sil($tabloAdi,$id)\n    {\n\n    }\n}\n?\u003e\n```\nGö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ı.\n\nPHP de çoklu arayüz kullanımı ve multi-inheritance istisnası:\n```php\n\u003c?php\ninterface x\n{\n    public function basX();\n}\n\ninterface y\n{\n    public function basY();\n}\n\ninterface z extends x,y\n{\n    public function basZ();\n}\n\nclass Test implements z\n{\n    public function basX()\n    {\n        \n    }\n    public function basY()\n    {\n        \n    }\n    public function basZ()\n    {\n\n    }\n}\n?\u003e\n```\n### İsim Uzayları [🐘](https://github.com/yenilikci/php/tree/master/OOP/namespace/uygulama \"🐘\")\n\nBirden ç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.\nAynı 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.\n\nİ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.\n\nİ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;\n\n```php\n\u003c?php\nnamespace Uygulama\\Helper;\n?\u003e\n```\nve\n\n```php\n\u003c?php\nnamespace Uygulama\\Controller;\n?\u003e\n```\ngibi 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.\n\nve ş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.\n\n#### uygulama-\u003econtroller altındaki Bildirimler sınıfı:\n```php\n\u003c?php\nnamespace Uygulama\\Controller;\n\nclass Bildirimler\n{\n    public function __construct()\n    {\n        echo 'Controller İçin Bildirimler oluşturuldu!';\n    }\n}\n?\u003e\n```\n\n#### uygulama-\u003ehelper altındaki Bildirimler sınıfı:\n\n```php\n\u003c?php\nnamespace Uygulama\\Helper;\n\nclass Bildirimler\n{\n    public function __construct()\n    {\n        echo 'Helper İçin Bildirimler oluşturuldu!';\n    }\n}\n?\u003e\n```\n\nUygulama içerisindeki index.php içerisinde bu iki sınıfı gerçekleyelim bunu **use** deyimini kullanarak yapabiliriz.\n\n```php\n\u003c?php\n// use deyimini kullanarakta yapabilirim\nuse Uygulama\\Controller\\Bildirimler; // use namespaceismi\\sınıfismi;\n$controllerBildirim = new Bildirimler\n?\u003e\n```\nveya use deyimini **kullanmayarak**, direk nesne oluştururken isim uzayını sınıf isminin başına ekleyerekte bunu sağlayabilirim.\n```php\n\u003c?php\n//veya şöyle bir kullanımda yapabilirim\n$helperBildirim = new Uygulama\\Helper\\Bildirimler;\n?\u003e\n```\n#### index.php dosyasının son hali :\n\n```php\n\u003c?php\nrequire __DIR__.'/controller/bildirimler.php';\nrequire __DIR__.'/helper/bildirimler.php';\n\n// use deyimini kullanarakta yapabilirim\nuse Uygulama\\Controller\\Bildirimler; // use namespaceismi\\sınıfismi;\n$controllerBildirim = new Bildirimler;\n\necho '\u003cbr\u003e';\n\n//veya şöyle bir kullanımda yapabilirim\n$helperBildirim = new Uygulama\\Helper\\Bildirimler;\n\n?\u003e\n```\nçıktımız ise şu şekilde olacaktır:\n\n![controller-helper](https://user-images.githubusercontent.com/57464067/82132175-94ebae80-97e5-11ea-9347-f8b11f16ffaf.png)\n\n\n\n\n\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyenilikci%2Fphp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyenilikci%2Fphp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyenilikci%2Fphp/lists"}