PDA

Orijinalini görmek için tıklayınız : Nesne Yönelimli PHP 'ye Giriş (PHP4 ve PHP5)


tepisenordek
08-11-2007, 20:35 PM
Nesne yönelimli programlamayı, modern programlama dilleri genellikle yazılım geliştirmek için destekler hatta ihtiyaç duyar. Amaç kodların tekrar kullanılması için sistemdeki nesnelerin özelliklerini, ilişkilerini kullanmaya çalışmaktır. PHP'de Nesne yönelimli programlamada (Object oriented programming) kullanacağımız temel kavramlar; nitelik,nesne,işlem,sarmalama,sınıf gibi terimler olacaktır.

Ben bu makalede bir örnek üzerinde çalışacağım. Üzerinde konuşmanın daha faydalı olacağını düşünüyorum. Ayrıca üzerinde çalışacağımız 2 adet aynı kodun ayrı PHP versionlarındaki biçimleri olacak ki, bu arada PHP4 ve PHP5 'deki güvenlik ve düzen farkı anlaşılsın. Kodumuz, benim sıkça karşılaştığım local server ım ve remote server ım arasında sorun yaratan yerel kullannıcı adı,şifre,db ismi ile uzak bağlantı arasındakinin farkı olmasından kaynaklanan uyum sorunu. Değiştirmeyi unutup dosyaları upload yaptığımda bir bakmışım çalışmıyor, yada aynı şekilde yerel sunucuda... Bir fonksiyonda yazılabilirdi ancak makale için bir örnek lazımdı :) Şimdi sadece LOCAL veya REMOTE yazarak sorun çözülüyor.


PHP:

1. <?php
2.
3. class Connect
4. {
5. // YEREL HOST ADI
6. var $local_host = "localhost";
7.
8. // YEREL VERİTABANI KULLANICI ADI
9. var $local_db_user = "root";
10.
11. // YEREL VERİTABANI ŞİFRESİ
12. var $local_db_pass = "";
13.
14. // YEREL VERİTABANI ADI
15. var $local_db_name = "db_isminiz";
16.
17. // YEREL TABLONUN KARAKTER SETİ
18. var $local_charset = "latin5";
19.
20. //UZAK BAĞLANTI HOST ADI
21. var $remote_host = "localhost";
22.
23. //UZAK BAĞLANTI VERİTABANI KULLANICI ADI
24. var $remote_db_user = "uzak_db_kullanıcınız";
25.
26. //UZAK BAĞLANTI VERİTABANI ŞİFRESİ
27. var $remote_db_pass = "uzak_dv_sifreniz";
28.
29. //UZAK BAĞLANTI VERİTABANI ADI
30. var $remote_db_name = "uzak_db_adınız";
31.
32. //UZAK BAĞLANTI KARAKTER SETİ
33. var $remote_charset = "latin5";
34.
35. // KULLANILACAK WEB ALANI "REMOTE" YADA "LOCAL"
36. var $hoster;
37.
38. // Sarmalama (Encapsulation) Desteği :: Erişim Fonksiyonları
39. // Set methodunun kapalı olarak çağırılması
40. function __set($name,$value)
41. {
42. $this->$name = $value;
43. }
44.
45. function connection ($hoster)
46. {
47. switch ($hoster)
48. {
49. case "LOCAL";
50. @mysql_connect($this->local_host,$this->local_db_user,$this->local_db_pass) || die
51. ("HATA 1: ".mysql_errno() ." : " .mysql_error()." !!!");
52. @mysql_select_db($this->local_db_name) || die ("HATA 2: " .mysql_errno() ." : "
53. .mysql_error()." !!!");
54. @mysql_query ("SET NAMES $this->local_charset ");
55. $query = @mysql_query("SHOW TABLES");
56. while ($read = mysql_fetch_array($query))
57. {
58. echo $read[0] ."<br>\n";
59. }
60. echo "LOCAL bağlantı başarı ile gerçekleştirildi";
61.
62. break;
63.
64. case "REMOTE";
65. @mysql_connect($this->remote_host,$this->remote_db_user,$this->remote_db_pass) || die
66. ("HATA 1: ".mysql_errno() ." : " .mysql_error()." !!!");
67. @mysql_select_db($this->remote_db_name) || die ("HATA 2: " .mysql_errno() ." : "
68. .mysql_error()." !!!");
69. @mysql_query ("SET NAMES $this->remote_charset ");
70. $query = @mysql_query("SHOW TABLES");
71. while ($read = mysql_fetch_array($query))
72. {
73. echo $read[0] ."<br>\n";
74. }
75. echo "REMOTE Baglanti Başari ile gerçekleştirildi";
76.
77. break;
78.
79. }
80. }
81. function baglan()
82. {
83. $this->connection($this->hoster);
84. }
85. }
86.
87. ?>


Sınıf yaratmak aynı bir fonksiyon yaratmaya benzer: class sınıfismi 'süslü parantez aç' 'süslü parantez kapa' Kodda görmüş olduğunuz 'var' ile ile başlayan değişkenlerimize 'nitelik' diyoruz. Bunlar duruma göre kodun içerisinden veya dışarısından değiştirilebilir veya okunabilirler. Sınıfımızın içine fonksiyonlar yaratabiliriz. Aslında amaç budur, yaratmalıyız diyebilirim. Ve elbette PHP de ne varsa fonksiyonlarımız içinde olabilir... $this-> isminde nesnedeki nitelikleri çağırabildiğimiz özel bir işlemcimiz vardır. Bunu örneğin: $this->local_db_user; şeklinde kullanırsak bu bize $local_db_user niteliğinin değerini verir. Bu sınıfımızda özel bir fonksiyon gözünüze çarpmıştır: __set() ; bu işleme sarmalama (encapsulation) denir. Fonksiyon ise erişim fonksiyonudur. Amacı niteliklere sınıfın dışından direkt olarak erişilmemesi, fonksiyonu kapalı olarak çağırarak kullanmasıdır. Bunu yapmasanızda sınıfın örneğini oluşturduğunuzda değeri değiştirebilirsiniz ancak buradaki amaç tek bir erişim noktası oluşturarak değerin güvenli olarak değiştirilmesini sağlamaktır. __set fonksiyonuna birkaç satır daha kod ekleyerek sorgulamasını genişletebilir, örneğin 'girilen değerin numerik olup olmadığı, öyleyse 5 ile 25 arasında mı' şeklinde kontrol yapabilirsiniz. -Buraya kadar konuştuğumuz herşey PHP4 ile ilgiliydi. Dikkatinizi çekiyorum. PHP5 e göre kapsamsız ve kolay olduğu için PHP4 ten başlamak fena fikir değil sanırım.- Son olarak sınıfımızı kullanacağımız dosyamıza çağırıyor, örneğini yaratıyor ve kullanıyoruz:

PHP:

1. <?php
2. require ("connect.php");
3. $baglanti = new Connect();
4. /* Kapalı olarak set fonksiyonumuzu çağırıyoruz */
5. $baglanti->hoster = 'LOCAL'; // LOCAL || REMOTE
6. $baglanti->baglan();
7. ?>


-$baglanti nesnesini oluşturmak için 'new' komutuyla, new sınıfismi : new Connect(); diyoruz -connection fonksiyonumuza ne yapacağını söyleyecek olan hoster niteliğine 'kapalı' olarak bir değer atıyoruz. Burada __set fonksiyonumuz çalışıyor. -Daha sonra ise nesnemize baglan fonksiyonunu çalıştırmasını söylüyoruz. Veritabanımız isteğe uygun olarak kullanımda... Peki bunu PHP5 ile yapsak neler değişecekti ; Chris Shifflet'in sunumunda OOP:PHP4->What's
PHP:

1. <?php
2.
3. class Connect
4. {
5.
6. // YEREL HOST ADI
7. private $local_host = "localhost";
8.
9. // YEREL VERİTABANI KULLANICI ADI
10. private $local_db_user = "root";
11.
12. // YEREL VERİTABANI ŞİFRESİ
13. private $local_db_pass = "";
14.
15. // YEREL VERİTABANI ADI
16. private $local_db_name = "yerel_db_adınız";
17.
18. // YEREL TABLONUN KARAKTER SETİ
19. private $local_charset = "latin5";
20.
21. //UZAK BAĞLANTI HOST ADI
22. private $remote_host = "localhost";
23.
24. //UZAK BAĞLANTI VERİTABANI KULLANICI ADI
25. private $remote_db_user = "uzak_db_kullanıcınız";
26.
27. //UZAK BAĞLANTI VERİTABANI ŞİFRESİ
28. private $remote_db_pass = "uzak_db_şifreniz";
29.
30. //UZAK BAĞLANTI VERİTABANI ADI
31. private $remote_db_name = "uzak_db_adınız";
32.
33. //UZAK BAĞLANTI KARAKTER SETİ
34. private $remote_charset = "latin5";
35.
36. // KULLANILACAK WEB ALANI "REMOTE" YADA "LOCAL"
37. private $hoster;
38.
39. function __construct($hoster)
40. {
41. echo "Yapılandırıcı $hoster parametresi ile çağırıldı.<br \n> $hoster şimdi WEB HİZMETİ
42. SAĞLANAN ALAN. <br \n>";
43. $this->hoster = $hoster;
44.
45. }
46.
47. private function connection ($hoster)
48. {
49. switch ($hoster)
50. {
51. case "LOCAL";
52. @mysql_connect($this->local_host,$this->local_db_user,$this->local_db_pass) || die
53. ("HATA 1: ".mysql_errno() ." : " .mysql_error()." !!!");
54. @mysql_select_db($this->local_db_name) || die ("HATA 2: " .mysql_errno() ." : "
55. .mysql_error()." !!!");
56. @mysql_query ("SET NAMES $this->local_charset ");
57. $query = @mysql_query("SHOW TABLES");
58. while ($read = mysql_fetch_array($query))
59. {
60. echo $read[0] ."<br>\n";
61. }
62. echo "LOCAL bağlantı başarı ile gerçekleştirildi";
63.
64. break;
65.
66. case "REMOTE";
67. @mysql_connect($this->remote_host,$this->remote_db_user,$this->remote_db_pass) || die
68. ("HATA 1: ".mysql_errno() ." : " .mysql_error()." !!!");
69. @mysql_select_db($this->remote_db_name) || die ("HATA 2: " .mysql_errno() ." : "
70. .mysql_error()." !!!");
71. @mysql_query ("SET NAMES $this->remote_charset ");
72. $query = @mysql_query("SHOW TABLES");
73. while ($read = mysql_fetch_array($query))
74. {
75. echo $read[0] ."<br>\n";
76. }
77. echo "REMOTE Baglanti Başari ile gerçekleştirildi";
78.
79. break;
80. }
81. }
82. public function baglan()
83. {
84. $this->connection($this->hoster);
85. }
86. }
87.
88. ?>


-Gözünüze ilk çarpan nitelikleri belirleyen 'var' tanımının yerinde 'private' yazıyor. PHP5 'in getirdiği güzelliklerden biri. Niteliklerimize ve fonksiyonlarımıza private,protected ve public şeklinde erişim sınırı koyabiliyoruz: Private : Nitelik yada fonksiyona(işlemlere) erişimin 'sadece' sınıfın içinden yapılabileceği anlamına gelir. Kalıtım vasıtasıyla dahi ulaşılamaz. ( İleriki bölümlerde bahsedeceğiz) Protected : Nitelik veya fonksiyonlara(işlemlere) erişimin 'sadece' sınıfın içerisinden yapılabileceğini gösterir. Kalıtım yoluyla altsınıflardan ulaşılabilir. Public : PHP4 teki var gibi düşünebilirsiniz. Belirtmediğiniz sürece varsayılan seçenek public tir. Ne işe yararlar? Tabiki tahmin ettiğiniz gibi nitelik ve işlemlerin dolayısıyla sınıfın güvenlik içinde çalışmasını sağlarlar. -İkinci olarak yine öntanımlı olan ancak PHP5 ile gelmiş olan bir fonksiyon vardır. __construct() Nedir, ne işe yarar? __constuct bir yapılandırıcıdır. Nesne oluşturulurken çağırılır ve belirten işlemi yaparlar (niteliklere başlangıç değeri vermek gibi) .Geriye dönük uyumluluk çerçevesinde PHP __construct özel işlemcisini bulamazsa 'sınıfla aynı adı' taşıyan bir fonksiyon arar. Yani PHP4 teki yapılandırıcımız neymiş :) Ben burada yapılandırıcının hazırladığı değeri göstermek için bir çıktı aldım ilk evvel daha sonra ise gerekli niteliğe atadım : $this->hoster = $hoster; Böylece yine güvenli şekilde niteliğimize sınıfın dışından direkt erişim yapmak yerine , bu sefer yapılandırıcı kullanarak değer atadık. Zaten 'private' olan bir niteliğe,fonksiyona(işleme) yapacağımız bir müdahale 'sınıf içerisinde __set() kullanmadığımız sürece' şu şekilde bir çıktı ile dönecektir :
KOD:

1. Fatal error: Cannot access private property Connect::$remote_db_name in
2. C:\wamp\www\Projeler\CLASSES\veritabani_php5.php on line 6



-Sınıfın dışından hatta alt sınıflardan bile ulaşılmamasını istediğimiz connection fonksiyonuna
'private' değeri verdik. Diğer işlemlerimize nereden ulaşılırsa ulaşılsın güvenlik sorunu
olmayacağı için varsayılan değer olan 'public' i atadık. Belirtmekte yarar var, public yazmasak ta
olur, ancak büyük projelerde ayrım yaparken kolaylık olması için belirtilmesinde fayda var.

Sıra geldi PHP5 'te sınıfımızın örneğini oluşturarak nesnemizi yaratmaya...
PHP:

1. <?php
2. require ("connect_php5.php");
3. /* Yapılandırıcıya parametre giriyoruz */
4. $baglanti = new Connect('LOCAL'); // LOCAL || REMOTE
5. $baglanti->baglan();
6. ?>


-Sınıfımızın bulunduğu dosyayı çağırıyoruz -__construct() fonksiyonumuza(işlemimize) parametre giriyoruz. Yapımıza göre iki seçeneğimiz var : LOCAL veya REMOTE -Son olarak nesnemize, seçtiğimiz veritabanını çalıştırmasını söyleyen işlemimiz olan baglan() ı çalıştırtıyoruz. Gördüğünüz gibi PHP4 ile PHP5 arasında daha başlangıçta dahi büyük farklılıklar var. Biz burada genellikle güvenlik ile ilgili kısımlarını gördük. İleriki çalışmalarımda, PHP5 in getirdiği PHP için hakiki nesne yönelimli programcılığı sağlayan özel işlemleri ve kolaylıkları anlatacağım. Ayrıca kalıtım yani alt sınıflara değineceğim. Ancak bu makalede de nesne yönelimli programlamanın mantığını anlatmış olduk ve bir giriş yaptık. Bu kadar bilgi ile dahi ufak çaplı sınıflar yazabilirsiniz.