Konu İçeriği
1 - Var, Public, Private, Extend, Protected Nedir & Construct Fonksiyonu
2 - Destruct Fonksiyonu
3 - Parent:: Deyimi
4 - Get_Declared_Classes Fonksiyonu
5 - Autoload Fonksiyonu
6 - Get_Class_Vars Fonksiyonu
7 - Serialize ve Unserialize
8 - Final Deyimi (Fonksiyonu)
9 - __CLASS__ ve __METHOD__ Fonksiyonları
10 - Class_Exists Fonksiyonu
11 - Örnek Uygulama
12 - __Autoload Fonksiyonu
13 - Örnek Uygulama Smf Forumlara Post Atmak
Php ve OOP (Object Orient Programlama)
54
●10.682
- 15-07-2010, 13:59:49
- 15-07-2010, 14:01:14arkadaşlar bundan 3 ay önce sanırım konu acmıstım r10.nete OOP hakkında Bilgi istemiştim pekde Faydalı Bilgiler Bulamamıştım O konuda belirtmiştim öğreneceğim bu işi diye ve öğrendiklerimi bu konu altında paylaşmak istedim
anlatımlarımdaki yalnışlarımı düzelten olursa sevinirim en azından daha net bilgiye varmış olurum
olumlu olumsuz yorumlarada açığım 
öncelikle nesnel programlamada öğrenilmesi gerekenlerin başında gelen şey sınıf tanımlama ve çağırmadır
bu gibi anlatımları bazı arkadaşlar kendi bloglarında yayınlamış
bu yüzden bende başladığım yerden aktarmaya devam ediyorum
Fırsat Buldukca ve Yeni Öğreneceğim Terimlerin Açıklamalı örnekli Olarak kod Bloglarını ekleyeceğim
Not: Konuyu Sabitlendiği için Sdemirkeser ustaya Tşk ederim
Yalnışlarımı Düzeltin Lütfen arkadaşlar
Public: Foknsiyona sınıf içinden ve sınıf dışından erişime izin verir.Ayrıca Kalıtım ile aktarılır.
Private: Bu erişim belirteci işaretlenen öğeye sadece sınıfın içinden erişilebileceği anlamına gelir.Ve bu öğeler kalıtım yoluyla aktarılmaz..
Protected:Bu erişim belirteci işaratelenen ögeye sadece sınıfın içinden erişilebileceği fakat alt sınıflara aktarılabileceği anlamına gelmektedir.
Extends:Eğer sınıfımız başka bir sınıfın alt sınıfı olacaksa extends anahtar sözcüğü ile aktarılır.
1 //Public Örneği 2 class sinifim { 3 public function yazdir(){ 4 echo "Merhaba Dünya"; 5 } 6 } 7 //Örnek 1 8 /*$yeni_sinif = new sinifim(); 9 $yeni_sinif->yazdir();*/Gördüğünüz Gibi Fonksiyonumuza Dışarıdan Erişim Sağlayabiliyoruz...
şimdi private özelliğini kullanarak deneyelim
1 //Private Örneği 2 class sinifim { 3 private function yazdir(){ 4 echo "Merhaba Dünya"; 5 } 6 } 7 //Örnek 2 8 /*$yeni_sinif = new sinifim(); 9 $yeni_sinif->yazdir();*/Fatal error: Cannot redeclare class sinifim in Böyle Bir Hata Aldık yani dışarıdan Erişim Yok
Şimdide Protected özelliğine gecelim
01 class sinifim { 02 protected function yazdir(){ 03 echo "Merhaba Dünya"; 04 } 05 } 06 class alt_sinif extends sinifim { 07 public function alt_metod(){ 08 $this->yazdir(); 09 } 10 } 11 12 //Örnek 3 13 /*$yeni_sinif = new alt_sinif(); 14 $yeni_sinif ->alt_metod();*/Burada Görüldüğü üzere Sadece Alt Sınıf ta kullanabiliyoruz ama gelen degeri ekrana basamıyoruz
Extends nedir
Extends bir sınıfı genişletme anlamına gelir yani 2 adet sınıfımız var ama 1 tanesine sonradan eklenti yapmak istiyoruz
kullanımı
class sinif_2 Extends sinif_1{ }buradaki su anlama geliyor sinif_2 sinif_1'in alt sınıfıdır ne işimize yarıyor
baska bir sınıfta iken direk ana sınıftaki metodları ve özelikleri kullanbiliyoruz yeni özellikler eklemiş oluyorz
alt sınıfı cağırdıgımızda ana sınıfada aktarım yapabiliriz detaylı örnek
class sinifim { var $deger; protected function yazdir(){ echo "Merhaba Dünya Ben Ana Sınıftan Geliyorum <br>"; } } class alt_sinif extends sinifim { public function alt_metod() { $this->yazdir(); } public function iceriden (){ echo "Bende Alt Sınıftan Geliyorum"; } } //Örnek 4 $yeni_sinif = new alt_sinif(); //alt sınıfa bağlanarak üst sınıftaki methodu cağırdık $yeni_sinif ->alt_metod(); //alt sınıfa bağlanarak içersindeki iceriden() methodunu cağırdık $yeni_sinif->iceriden(); // Alt Sınıfı Çağırıyor ama üst sınıftaki özelliğe deger atıyoruz $alt_siniftan_ana_sinifa_gonder = new alt_sinif(); $alt_siniftan_ana_sinifa_gonder->deger = "bakın burada ise alt sınıfı çağırıyor ama üst sınıfın özelliğine atama yapıyoruz"yani sınıfımızın herhangi bir sınıfa bağlı olacağını belirtir örnekteki gibi örnekte ne yaptık
sinifim isimli siniftan alt_sinifim isimli sınıfa yazdir() methodunu cektik
ve alt sınıfı çağırarak üst sınıftaki $deger özelliğine atama yaptık umarım anlaşılır olmuştur arkadaşlar
Kaynak
__________________________________________________ _____________
__construct fonksiyonu arkadaşlar bir sınıf çağrıldıgında sınıftaki kod blogu işlemini yapmadan önce çalışmasını istediğimiz metod'dur
örnek eger kullanıcı ismi doğru ise işleme başlasın değil ise işlemi durdursun
01 <? 02 class sinifim { 03 var $kullanici; 04 var $sifre; 05 public function __construct($user,$pass){//sınıf cağrıldıgında ilk çalışacak metod metodun çağrılmasına gerek yoktur default olarak çalışacaktır 06 07 $username = "bytrislasis"; // Kullanıcı Adımız 08 $password = "123456"; // şifremiz 09 10 if (($username == $user)and($password==$pass)) { // Gelen kullanıcı Adı ve Şifre Bizim Belirlediğimize Eşitmi diye bakıyoruz 11 12 $this->kullanici = $user; // Kullanıcı adı Eşit ise gelen degeri kullanıcı özelliğimize atıyoruz 13 $this->sifre = $pass; // şifre adı Eşit ise gelen degeri sifre özelliğimize atıyoruz 14 15 }else {// gelen degerler eşit değilse 16 echo "Kullanıcı Adınız veya Şifreniz Yalnış<br>"; 17 exit;//Fonksiyonumuzu Burada Durduruyoruz 18 } 19 20 } 21 public function yazdir (){ 22 echo "Kullanıcı Adınız :".$this->kullanici."<br>"; 23 echo "Adınıza Ait Şifre:".$this->sifre."<br>"; 24 } 25 } 26 27 $yeni = new sinifim("bytrislasis","123456"); 28 $yeni->yazdir();//degerlerimiz doğru ise bu metod çalışacak değilse belirlediğimiz hata blogu gelecektir.. 29 ?>Kaynak - 15-07-2010, 14:02:04arkadaşlar __destruct Fonksiyonu __construct Fonksiyonun tam tersine sınıfın çağrıldıgında yani başlangıçta değilde sınıftaki işlemler icra edildikten sonra yapılacak işlemi belirtir.. örnek aşşağıdadır..
01 <? 02 class sinifim { 03 public function yazdir (){ 04 echo "Sınıf Başarıyla Başlatıldı<br>"; 05 } 06 public function __destruct(){ 07 echo "Sınıftan Cıkılmıştır...<br>"; 08 } 09 } 10 11 $yeni = new sinifim(); 12 $yeni-> yazdir(); // dikkat ederseniz __destruct metodu kendiliğinden çalışmaktadır.. 13 ?>Kaynak - 15-07-2010, 14:05:00Parent:: Deyimi
Kod yazarken ana sınıfların işlev ve değişkenlerini kullanmanız gerekebilir.
Türetilmiş sınıfınızı temiz tutmak veya ana sınıfın kodunu özelleştirmek istediğiniz durumlar buna birer örnektir.
ana sınıfın ismini kullanmak yerine, özel parent:: ismini kullanarak sınıfınızın extends yani alt sınıf bildiriminde belirtilen ana sınıfın ismine atıf yapabilirsiniz.
Böylelikle, ana sınıfın ismini birden fazla yerde kullanmamış olursunuz.
Kalıtsal ağacınızı gerçeklenimin ileri safhalarında değiştirmek ihtiyacı duyarsanız sınıfınızın sadece extends bildiriminde değişiklik yaparak bunu kolayca yapabilirsiniz.
Örnek Aşşağıdadır
01 class sinifim { 02 public function Welcome (){ 03 echo "Bytrislasis"; 04 } 05 } 06 class alt_Sinifim extends sinifim { 07 public function Welcome(){ 08 echo "Hoşgeldin "; 09 parent::Welcome(); 10 11 } 12 } 13 $yeni = new alt_Sinifim(); 14 $yeni->Welcome(); 15 // çıktısı şu sekilde olacaktır (Hoşgeldin Bytrislasis)arkadaşlar dikkat ederseniz bir istisna gibi işlem yaptık ve ana sınıftan Welcome() Metodunu Parent:: Fonksiyonu ile çağırdık diğer çağırma sekline bakalım
01 class sinifim { 02 public function Welcome (){ 03 echo "Bytrislasis"; 04 } 05 } 06 class alt_Sinifim extends sinifim { 07 public function Welcome(){ 08 echo "Hoşgeldin "; 09 $sinifimdan_gelen = new sinifim(); 10 $sinifimdan_gelen ->Welcome(); 11 12 } 13 } 14 $yeni = new alt_Sinifim(); 15 $yeni->Welcome(); 16 // çıktısı şu sekilde olacaktır (Hoşgeldin Bytrislasis)burada suna dikkat edin
1 $sinifimdan_gelen = new sinifim(); 2 $sinifimdan_gelen ->Welcome();
alt sınıfımız içerisinde yeniden o sınıfı çağırdık $this deyimi ilede cağırabilirdik ama Parent:: işimizi kolaylaştırıyor ve ana sınıfımızda değişiklik yapmadan özel tutarak işlemimizi gercekleştiriyor...
Kaynak - 15-07-2010, 14:10:40get_declared_classes fonksiyonu bize (array) yani dizi halinde tanımlı sınıf isimlerini verir bazı yerlerde işinize yarayacağını düşündüğüm için örnek eklemek istedim
01 <? 02 class A { 03 } 04 class B { 05 } 06 class C { 07 } 08 class D { 09 } 10 print_r(array_reverse(get_declared_classes())); 11 ?>dikkat ederseniz A,B,C,D isimlerinde boş sınıflar oluşturdum bu tanımlanan sınıflarıda gösterir print_r fonksiyonu ile cağırdıgımda
benim tanımladıgım sınıfları en sonda gösteriyor ama array_reverse() fonksiyonunu kullanarak tersine sıraladım ve sınıflarımı en üstte göstermesini istedim
çıktısı şu şekilde olacaktır.
Array ( [0] => D [1] => C [2] => B [3] => A [4] => SQLiteException [5] => SQLiteUnbuffered [6] => SQLiteResult [7] => SQLiteDatabase [8] => SoapHeader [9] => SoapParam [10] => SoapFault [11] => SoapServer [12] => SoapVar [13] => SoapClient [14] => PDORow [15] => PDOStatement [16] => PDO [17] => PDOException [18] => mysqli_stmt [19] => mysqli_result [20] => mysqli_warning [21] => mysqli [22] => mysqli_driver [23] => mysqli_sql_exception [24] => XMLWriter [25] => XMLReader [26] => SplObjectStorage [27] => UnexpectedValueException [28] => UnderflowException [29] => RangeException [30] => OverflowException [31] => OutOfBoundsException [32] => RuntimeException [33] => OutOfRangeException [34] => LengthException [35] => InvalidArgumentException [36] => DomainException [37] => BadMethodCallException [38] => BadFunctionCallException [39] => LogicException [40] => SimpleXMLIterator [41] => SplTempFileObject [42] => SplFileObject [43] => RecursiveDirectoryIterator [44] => DirectoryIterator [45] => SplFileInfo [46] => RecursiveArrayIterator [47] => ArrayIterator [48] => ArrayObject [49] => EmptyIterator [50] => RecursiveRegexIterator [51] => RegexIterator [52] => InfiniteIterator [53] => AppendIterator [54] => NoRewindIterator [55] => RecursiveCachingIterator [56] => CachingIterator [57] => LimitIterator [58] => ParentIterator [59] => RecursiveFilterIterator [60] => FilterIterator [61] => IteratorIterator [62] => RecursiveIteratorIterator [63] => DOMXPath [64] => DOMStringExtend [65] => DOMProcessingInstruction [66] => DOMEntityReference [67] => DOMEntity [68] => DOMNotation [69] => DOMDocumentType [70] => DOMCdataSection [71] => DOMConfiguration [72] => DOMLocator [73] => DOMErrorHandler [74] => DOMDomError [75] => DOMUserDataHandler [76] => DOMTypeinfo [77] => DOMComment [78] => DOMText [79] => DOMElement [80] => DOMAttr [81] => DOMCharacterData [82] => DOMNamedNodeMap [83] => DOMNodeList [84] => DOMDocument [85] => DOMDocumentFragment [86] => DOMNameSpaceNode [87] => DOMNode [88] => DOMImplementation [89] => DOMImplementationSource [90] => DOMImplementationList [91] => DOMNameList [92] => DOMStringList [93] => DOMException [94] => SimpleXMLElement [95] => Directory [96] => php_user_filter [97] => __PHP_Incomplete_Class [98] => LibXMLError [99] => DateTimeZone [100] => DateTime [101] => ReflectionExtension [102] => ReflectionProperty [103] => ReflectionObject [104] => ReflectionClass [105] => ReflectionMethod [106] => ReflectionParameter [107] => ReflectionFunction [108] => ReflectionFunctionAbstract [109] => Reflection [110] => ReflectionException [111] => dotnet [112] => com [113] => variant [114] => com_safearray_proxy [115] => com_exception [116] => COMPersistHelper [117] => ErrorException [118] => Exception [119] => stdClass )
Kaynak - 15-07-2010, 14:12:15__autoload fonksiyonun bize sağladıgı güzellik class ismini tanıyarak o classın bulundugu dosyayı projemize include etmesidir Dikkat etmemiz gereken husus sınıfımız ismi ile bulundugu dosya ismi aynı olmalıdır örnek aşşağıdadır..
1 <?php 2 class index { 3 var $isim = "ByTrislasis"; 4 public function yaz (){ 5 echo $this->isim; 6 } 7 } 8 ?>bu sınıfımızı index.php adında kaydedin dikkat edin class ismimizde index
01 <?php 02 03 function __autoload($class_name){ 04 include ($class_name.'.php'); 05 } 06 07 $yeni = new index(); 08 $yeni ->yaz(); 09 10 ?>bu kod bloğunuda herhangi bir isimle kaydedin dikkat ederseniz classın oldugu dosyayı include ettiğini göreceksiniz.
Kaynak - 15-07-2010, 14:25:31arkadaşlar get_class_vars fonksiyonu ile sınıfımızda belirlediğimiz özellikleri özellik adı ve degeri halinde bir dizi'de görebiliriz... örnek aşşağıdadır dikkat ederseniz Private ve Protected olan özellikleri vermemektedir..
01 <? 02 class sinifim { 03 var $a = "bytrislasis"; 04 public $b = "phpogreniyorum.com"; 05 private $c = "Burayı Göstermez çünki Private"; 06 protected $d = "Burayıda Göstermez çünki Protected"; 07 var $e = "E özelliği"; 08 } 09 10 print_r(get_class_vars(sinifim)); 11 ?>Çıktısı Şu Şekilde Olacaktır.. Array ( [a] => bytrislasis [b] => phpogreniyorum.com [e] => E özelliği )
Kaynak - 15-07-2010, 15:14:15kimi yerde bazen verilerimizi veritabanında değilde herhangi bir dosyada saklayıp daha sonra cağırma gereksinimi duyarız örneğin
bir post işleminde kullanıcı adı ve şifreyi daha sonra baska bir yerde kullanmak için session cookie kullanabiliriz ama serialize ve unserialize degerleri byte olarak tutar ve daha sonra projemizin herhangi bir yerinde cağırmamız gerekebilir örnek
not : daha nerelerde kullanıldıgı hakkında bir bilgim yok ama eminimki php bunu yapıyorsa bir bildiği vardır
//Serialize Etmek (Dosyaya kaydetmek) class Deneme { public $ad; public $soyad; public $tc; public function __construct($ad,$soyad,$tc){ $this->ad=$ad; $this->soyad=$soyad; $this->tc=$tc; } } $Deneme= new Deneme('Bytrislasis','Sahin','1234567891011'); touch("kayit.txt");//her ihtimale karsı file_put_contents('kayit.txt',serialize($Deneme));dosyamızı kaydedin örnek index.php sonra 1 kere çalıştırın
Buda o Dosyadan tekrar okuma işlemi
//Unserialize İşlemi include("index.php"); class Deneme { public $ad; public $soyad; public $tc; public function __construct($ad,$soyad,$tc){ $this->ad=$ad; $this->soyad=$soyad; $this->tc=$tc; } } $Deneme=unserialize(file_get_contents('kayit.txt')); echo $Deneme->ad; ?>detaylı kaynak
zaten acıklama yapılmış
Bir değerin saklanabilir bir gösterimini üretir.
PHP değerlerini, yapısını ve türünü kaybetmeden saklamak veya aktarmak için kullanışlıdır.
Böyle bir değerden tekrar özgün değeri elde etmek için unserialize() işlevini kullanın.
Kaynak
olumlu olumsuz yorumlarada açığım
Tek sıkıntılı yerim 3. ve 4. örnek arasında fark oldu? Biraz daha açıklayabilir misin orayı?