200 |
201 | ```
202 | #### Left Join
203 | ```sql
204 | SELECT * FROM Tablo_Adi LEFT JOIN digerTablo_Adi ON Tablo_adi.id = digerTablo_Adi.id;
205 | ```
206 | Sol tablodaki tüm satırları ve koşula uygun olan sağ tablodaki satırları seçip birleştirelim ve bunları gruplayalım.
207 | > Query içinde kullanımı:
208 |
209 | ```sql
210 | SELECT verikategorisi.* , COUNT(veriler.id) AS toplamVeri
211 | FROM verikategorisi
212 | LEFT JOIN veriler ON veriler.kategori_id = verikategorisi.id
213 | GROUP BY verikategorisi.id
214 | ```
215 | fetchAll() ile bu verileri çektiğimizi ve $kategori isimli bir değişkene atadığımızı varsayalım.
216 |
217 | ```php
218 |
228 | ```
229 | ### Arama İşlemi (LIKE) Kulanımı [🐘](https://github.com/yenilikci/php/blob/master/PDO/homepage.php "🐘")
230 | ```sql
231 | SELECT * FROM Tablo_Adi WHERE Kolon_Adi LIKE "%a%";
232 | ```
233 | LIKE komutu WHERE komutu ile birlikte bir kolonda ilgili değeri aramak için kullanılır.
234 |
235 | #### Joker Karakterler:
236 | ##### * Birden fazla bilinmeyen karakteri sorgulatacaksak kullanırız.
237 | ##### # Bilinmeyen tek rakam için kullanırız.
238 | ##### ? Bilinmeyen tek karakter için kullanırız.
239 |
240 | > Query içinde kullanımı:
241 |
242 | ```php
243 | query($sql)->fetchAll(PDO::FETCH_ASSOC);
258 | //son eklenen verilere göre listele
259 |
260 | ?>
261 |
262 | ```
263 | ## OOP
264 | ### Sınıflar [🐘](https://github.com/yenilikci/php/blob/master/OOP/sinif.php "🐘")
265 | 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.
266 | 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.
267 | İsimlendirme yapılırken türkçe karakter kullanımına izin vermektedir.
268 | Harf veya alt çizgi ile sınıf ismini başlatabiliriz.
269 |
270 | **Örnek Sınıf Kullanımı:**
271 | ```php
272 | ad;
300 | }
301 | function soyadDondur()
302 | {
303 | return $this->soyad;
304 | }
305 |
306 | //fonksiyon içerisinde fonksiyonumuzu döndürmek isteseydik
307 | function yasBas()
308 | {
309 | return $this->kacYasinda(2020,$this::DOGUMTARIHI);
310 | }
311 |
312 | //sabiti geriye döndürmek
313 | function dogumTarihi()
314 | {
315 | return $this::DOGUMTARIHI;
316 | }//veya self kullanabiliriz
317 | function dogumTarihi2()
318 | {
319 | return self::DOGUMTARIHI;
320 | }
321 | }
322 | ?>
323 | ```
324 | **Şimdi bu sınıftan nesneler türetelim**
325 | ```php
326 |
332 | ```
333 | **nesnelerimiz ile bu sınıfın özellik ve metotlarına erişelim:**
334 |
335 | > Sınıf içerisindeki özelliklere ve metotlara erişmek için -> işareti kullanılır
336 |
337 | Metotlara erişmek ve ekrana yazdırmak
338 | ```php
339 | echo $uye->stringAdDondur() . " ";
340 | ```
341 | Özelliğe erişmek ve ekrana yazdırmak
342 | ```php
343 | echo $uye->soyad . " " ;
344 | ```
345 | Sabite erişmek ve ekrana yazdırmak
346 | ```php
347 | echo $uye::DOGUMTARIHI;
348 | ```
349 | uye2 için özelliklere farklı değerler atayalım
350 | ```php
351 | $uye2->ad = 'Farklıİsim';
352 | $uye2->soyad = 'FarkliSoyad';
353 | ```
354 |
355 | uye2'nin değerlerini ekrana yazalım
356 | ```php
357 | ";
359 | echo " ". $uye2->ad;
360 | echo " ". $uye2->soyad;
361 | echo " ". $uye2::DOGUMTARIHI;
362 | ?>
363 | ```
364 | Parametreli metodu çağırmak
365 | ```php
366 | ";
368 | echo "KAÇ YAŞINDALAR?" . " ";
369 | echo $uye->kacYasinda(2020,$uye::DOGUMTARIHI);
370 | ?>
371 | ```
372 | Özellik ve fonksiyonları geri döndüren fonskiyonları çağırmak
373 | ```php
374 | ";
376 | echo "Birde özellikleri geri döndürerek ad ve soyadı ekrana bastıralım" . ";
377 | echo $uye->adDondur() . " ";
378 | echo $uye->soyadDondur()." ";
379 | echo " ". "Birde metodu geri döndürerek yaşı ekrana bastıralım" . " ";
380 | echo $uye->yasBas()." ";
381 | ?>
382 | ```
383 | > this nesneyi referans alır,self ise sınıfı referans alır
384 |
385 | This ve self ile sabit döndüren fonksiyonların ekrana bastırılması
386 | ```php
387 | dogumTarihi()." "; //this kullanıldı
389 | echo $uye->dogumTarihi2(); //self kullanıldı
390 | ?>
391 | ```
392 | Çıktı
393 |
394 | 
395 |
396 | ### Görünürlük [🐘](https://github.com/yenilikci/php/blob/master/OOP/gorunurluk.php "🐘")
397 | Bir özellik, sabit ya da metodun görünürlüğünü üç farklı şekilde belirleyebiliriz.
398 | Kullanımlara örnek sınıf üzerinden bakacak olursak:
399 | ```php
400 | b; //private özelliği public metotta geriye döndürebilirim
410 | }
411 |
412 | protected $c = 'c';
413 | //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
414 |
415 | private function geriDonA() //private func
416 | {
417 | return $this->a;
418 | }
419 |
420 | protected function geriDonC() //protected func
421 | {
422 | return $this->c;
423 | }
424 | }
425 | ?>
426 | ```
427 |
428 | Şimdi bu özellik ve metotları ekrana bastırmaya çalışalım
429 | ```php
430 | a; //bu özelliğe rahatça ekrana basabildim
434 |
435 | echo $test->b; //bu özelliği ekrana bastırmak istediğimde hata ile karşılaşıyorum
436 |
437 | echo $test->geriDonB(); //private özelliği public fonksiyon ile bastırdım
438 |
439 | echo $test->c; //hata
440 |
441 | echo $test->geriDonA(); //hata
442 |
443 | echo $test->geriDonC(); //hata
444 | ?>
445 | ```
446 | ### Kurucu ve Yıkıcı Metot [🐘](https://github.com/yenilikci/php/blob/master/OOP/kurucuyikici.php "🐘")
447 |
448 | Kurucu metot bir sınıf başlatıldığında otomatik olarak çağrılacak fonksiyondur.
449 | ```php
450 |
456 | ```
457 |
458 | Yıkıcı metot bir sınıfın çalışması bittiğinde çalışacak son metot.
459 | ```php
460 |
466 | ```
467 |
468 | Örneğin;
469 | ```php
470 | degisken = $a;
480 | echo $this->degisken.PHP_EOL;
481 | }
482 |
483 | public function bas()
484 | {
485 | echo 'ekrana yazı bastım'.PHP_EOL;
486 | }
487 |
488 | //yıkıcı metot
489 | public function __destruct()
490 | {
491 | echo 'yıkıcı metot çalıştı'.PHP_EOL;
492 | }
493 |
494 | }
495 |
496 | $nesne = new YapYik('Kurucu metot çalıştı');
497 | $nesne->bas();
498 |
499 | ?>
500 | ```
501 | Çıktı
502 |
503 | 
504 |
505 | ### Kalıtım [🐘](https://github.com/yenilikci/php/blob/master/OOP/kalitim.php "🐘")
506 |
507 | Kalıtım sınıf ve nesne ilişkilerini düzenleyen iyi kurgulanmış bir prensiptir.
508 | Türeyen sınıflar ,türetilen sınıfların özellik ve metotlarını public ve protected olduğu sürece kullanabilirler.
509 | Genişletmek için extends deyimi kullanılır.
510 |
511 | Örnek bir temel(base) - ebeveyn(parent) sınıf :
512 | ```php
513 | adsoyad = $adsoyad;
523 | }
524 |
525 | public function maas($maas)
526 | {
527 | //sınıfın içerisinde maas dışarıdan gelen maas değerine eşit olsun
528 | $this->maas = $maas;
529 | }
530 |
531 | public function senelikMaas()
532 | {
533 | return ($this->maas*12).'₺';
534 | }
535 | }
536 | ?>
537 | ```
538 |
539 | Calisan sınıfından türetilen Muhasebe sınıfı:
540 | ```php
541 |
544 | ```
545 | Calisan sınıfından türetilen IT sınıfı:
546 | > 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
547 | ```php
548 | adsoyad.' senelik maaş olarak '.parent::senelikMaas();
553 | }
554 | }
555 | ?>
556 | ```
557 |
558 | 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:
559 | ```php
560 | self::bas(),
585 | 'y' => parent::bas(),
586 | 'x' => x::bas()
587 | ];
588 | }
589 | }
590 |
591 | $z = new z;
592 | print_r($z->basGetir());
593 | ?>
594 | ```
595 | ### Static Deyimi [🐘](https://github.com/yenilikci/php/blob/master/OOP/staticornek.php "🐘")
596 |
597 | Static tanımlama ile sınıf örneği oluşturmadan o sınıfın static metot ve özelliklerine erişilebilir.
598 | Bu erişimi sağlamak için çift iki nokta erişecini kullanırız. (::)
599 | Fakat php şu anda sınıfların static "METOTLARINA" sınıf örneği oluşturarakta erişime izin vermektedir.
600 | Static metotlar ilk çağrıldığında ram'e aktarılır ve daha sonra ramden okunur, performans açısından kuvvetlidir.
601 |
602 | ```php
603 |
617 | ```
618 | Static metotlar içerisinde yalnızca sınıfın static özelliklerine erişim sağlanabilir.
619 |
620 | ```php
621 |
635 | ```
636 | 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:
637 |
638 | ```php
639 | Oku();
663 |
664 | ?>
665 | ```
666 | ### Sınıf Sabitleri [🐘](https://github.com/yenilikci/php/blob/master/OOP/sabit.php "🐘")
667 |
668 | Sınıf sabitleri tanımlanırken **const** ifadesi kullanılır. Değişkenler gibi tanımlanırken $ imi kullanılmaz.
669 | 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.
670 |
671 | Örneğin File isminde bir sınıfımız olsun ve DIRECTORY isimli bir sabit içersin:
672 | ```php
673 |
685 | ```
686 | Geri dönen değeri ekranda görmek:
687 | ```php
688 | getDirectory();
691 |
692 | //veya sınıfı başlatmadan da sabitin değerini alabiliriz
693 |
694 | echo " ". File::DIRECTORY;
695 | ?>
696 | ```
697 | Şimdi de Folder isimli bir sınıf tanımlayalım ve bu da File sınıfından türetilsin:
698 | ```php
699 |
708 | ```
709 | Dizin değerini geri döndürme işlemini Folder sınıfının nesnesi ile yapalım:
710 | ```php
711 | ". $folder->getDirectory();
714 | ?>
715 | ```
716 | Çıktımız şu şekilde olacaktır:
717 |
718 | 
719 |
720 | ### Sınıf Soyutlama [🐘](https://github.com/yenilikci/php/blob/master/OOP/soyutlama.php "🐘")
721 |
722 | 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.
723 | 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.
724 | 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.
725 |
726 | Örneğin PHP tabanlı bir CMS'e eklenti geliştirdiğimiz senaryoyu ele alalım bu basit ama anlaşılır bir örnek olacak.
727 | Eklenti isimli bir soyut sınıf tasarlayalım:
728 |
729 | ```php
730 | '.$this->title.'';
739 | echo '
'.$this->content.'
';
740 | }
741 | }
742 | ?>
743 | ```
744 | 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.
745 |
746 | SonYorumlar sınıfı:
747 | ```php
748 | title = $title;
755 | }
756 | public function setContent($content)
757 | {
758 | //özelliğin tanımı metot içinde yapıldı (content)
759 | $this->content = $content;
760 | }
761 | }
762 | ?>
763 | ```
764 | SosyalMedya sınıfı:
765 | ```php
766 | title = $title;
773 | }
774 | public function setContent($content)
775 | {
776 | //özelliğin tanımı metot içinde yapıldı (content)
777 | $this->content = $content;
778 | }
779 | }
780 | ?>
781 | ```
782 |
783 | Daha sonrasında bu iki sınıfımı başlatıyorum, title ve content özelliklerini set ediyorum:
784 | ```php
785 | setTitle('Son Yorumlar');
790 | $sonyorumlar->setContent('Son Yorumlar Burada Gözükecek');
791 |
792 | //SosyalMedya sınıfını başlatıyorum
793 | $sosyalmedya = new SosyalMedya;
794 | //değerleri set edelim
795 | $sosyalmedya->setTitle('Sosyal Medya');
796 | $sosyalmedya->setContent('Sosyal Medya Bağlantıları Burada Gözükecek');
797 | ?>
798 | ```
799 | Ş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:
800 | ```php
801 | show();
803 | echo " ";
804 | echo $sosyalmedya->show();
805 | ?>
806 | ```
807 | Çıktı şu şekilde olacaktır:
808 |
809 | 
810 |
811 | ### Arayüzler [🐘](https://github.com/yenilikci/php/blob/master/OOP/arayuz.php "🐘")
812 |
813 | 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.
814 | Ö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.
815 | **Arayüzler** soyut metotlar ve sabitler içerir, **soyut sınıflar** soyut metotlar,sabitler,normal metotlar ve özellikler içerir.
816 | **PHP** dilinde **arayüzlerin** diğer dillerden bir farklılığı vardır, **static metotları da içerebilir**.
817 | Arayüzler nesne olarak başlatılamazlar (new anahtar kelimesi ile).
818 | Arayüzlerin içerisinde **kurucu** ve **yıkıcı** metotlar **tanımlanabilir**.
819 | 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.
820 | Aynı sınıfta birden fazla **arayüz** kullanılabilir, fakat aynı sınıf sadece bir **abstract** sınıftan türeyebilir.
821 |
822 | Örneğin Islem adında bir arayüz tanımlayalım:
823 | ```php
824 |
833 | ```
834 |
835 | Bundan farklı olarak birde VT adında bir arayüz tanımlayalım:
836 | ```php
837 |
843 | ```
844 | Şimdi ise Veritabani sınıfımıza bu arayüzleri implement edelim:
845 | ```php
846 |
872 | ```
873 | 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ı.
874 |
875 | PHP de çoklu arayüz kullanımı ve multi-inheritance istisnası:
876 | ```php
877 |
909 | ```
910 | ### İsim Uzayları [🐘](https://github.com/yenilikci/php/tree/master/OOP/namespace/uygulama "🐘")
911 |
912 | 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.
913 | 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.
914 |
915 | İ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.
916 |
917 | İ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;
918 |
919 | ```php
920 |
923 | ```
924 | ve
925 |
926 | ```php
927 |
930 | ```
931 | 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.
932 |
933 | 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.
934 |
935 | #### uygulama->controller altındaki Bildirimler sınıfı:
936 | ```php
937 |
948 | ```
949 |
950 | #### uygulama->helper altındaki Bildirimler sınıfı:
951 |
952 | ```php
953 |
964 | ```
965 |
966 | Uygulama içerisindeki index.php içerisinde bu iki sınıfı gerçekleyelim bunu **use** deyimini kullanarak yapabiliriz.
967 |
968 | ```php
969 |
974 | ```
975 | veya use deyimini **kullanmayarak**, direk nesne oluştururken isim uzayını sınıf isminin başına ekleyerekte bunu sağlayabilirim.
976 | ```php
977 |
981 | ```
982 | #### index.php dosyasının son hali :
983 |
984 | ```php
985 | ';
994 |
995 | //veya şöyle bir kullanımda yapabilirim
996 | $helperBildirim = new Uygulama\Helper\Bildirimler;
997 |
998 | ?>
999 | ```
1000 | çıktımız ise şu şekilde olacaktır:
1001 |
1002 | 
1003 |
1004 |
1005 |
1006 |
1007 |
1008 |
1009 |
--------------------------------------------------------------------------------