Why Not ? a deep breath and let yourself fall out of life

23Oca/090

Degiskenden objeye

Manual'de gezinirken gördüğüm bir yöntem gerçekten hızlı bir kullanımı var.

<?php

$obj = (object) array('foo' => 'bar', 'property' => 'value');

echo $obj->foo; // prints 'bar'
echo $obj->property; // prints 'value'

?>
22Oca/091

PHP’de sınıf yapılarını anlamak…

Son günlerde 2002-2004 yılları arasında aktif olduğum ceviz.net'in forumunda tekrardan aktif olmaya başladım işlerden fırsat buldukca baktığım forum sayfalarında özellikle dikkatimi çeken sorular ve sorunların başında bir çok PHP kullanıcısının ve PHP öğrenmeye niyetlenmiş kişilerin SQL ile PHP yi hatta HTML'i birbirinden ayırt edememeleri idi. PHP bölümünde SQL sorularının gezmesi ve yöneticilerinde bu başlıkları ilgili yerlere taşımaması tabikide ayrı bir soru işareti oluşturuyor.

Forum içerisindeki sorulardan bir-iki tanesi beni bu makaleyi yazmaya itti:

1. php'de sınıflar nerelerde kullanılmalıdır ?

2. php'de sınıflar sizcede çok saçma değilmi ?

Bu sorular bana kişilerin sınıf yapılarının programlama içerisinde ne şekilde kullanılabileceği hakkında pek bir bilgiye sahip olmadıklarına dair düşüncelere sevk etti.

Birinci sorumuz sınıfların gerçekten nerelerde kullanılabileceği hakkında sorarken diğeri programlamada sınıfın nasıl ve nerede kullanılması gerektiğini bildiğini ve PHP'nin bunun için yetersiz olduğunu iddia ediyor du.

Ben ise bu sorulara kendi bilgimce bir cevap vermeye çalıştım.

Öncelikle Sınıf'ın ne olduğunu ortaya koyalım. Her sınıf bir obje'yi ele alır. Bu konuda basit bir obje ile işimize başlıyabiliriz. Ne seçelim ne seçelim ? Her yerde kullanabileceğimiz bir şey olmalı bu ? Veri tabanı bağlantısı ? I-ıh olmaz çok karışık. Bir form yapısı ? I-ıh o da karışık. Her zaman hepimiz dosya dizin işlemleri üzerine işlevler gerçekleştirmişizdir değil mi ? Bir dosya yüklemesi, oradan oraya dosya taşıma, kopyalama, dosya oluşturma gibi işlemleri yapacak bir sınıf geliştirebiliriz. İlk bakışta bir fonksiyon topluluğu gibi görünüyor evet. Hadi biraz kod yazalım.

<?php

class dosyadizin {

protected $dizin;

public function __construct($dizin) {

$this->dizin = $dizin;

}

}

$dizin = new dosyadizin('./');

?>

Yukarıdaki kodlarımızızı tanıyalım şimdide class, public, function, $this, __consturct bu arkadaşlar ne işe yaradığını anlayalım...

class: Bir sınıf tanımlamamıza imkan sağlayan sözcüktür.

public: Oluşturmuş olduğumuz obje'nin kullanım tipini belirlemek için kullanırız. PHP'de şu an bunlardan üç(3) tane vardır. Public Protected Private olarak.

Public: Public olarak tanımladığımız bir değişken/fonksiyon'a sınıfımız içerisinde ve dışarıdan erişebiliriz.

Protected: Protected olarak tanımladığımız bir değişken/fonksiyonumuzu sınıfımız içerisinde extend ettiğimiz başka bir sınıf üzerinden kullanabiliriz.

Private: Protected olarak tanımladığımız bir değişken/fonksiyonumuza sadece sınıfımız içerisinden erişebiliriz.

function: bildiğimiz fonksiyon'u ifade eder :)

$this: $this'i büyülü bir cuval gibi düşünebiliriz. Bir fonksiyondan bir diğer fonksiyona bir sınıftan diğer sınıfa bir şeyler taşımak için görevlendirdiğimiz bir taşıncı gibi.

__consturct: Bu fonksiyon gibi “__” içerisinde başlayan fonksiyonlarımızda büyülüdür. Bunlardan ilerleyen zamanlarda bir dizi göreceğiz. Hatice'yi geçtikten sonra neticemizde bu elemanımız sınıf oluşturuluken yapılmasını istediğimiz işlemleri içerisinde barındırmaktadır.

Sınıfımızı oluştururken kullandığımız şeyler hakkında bilgi edindikten sonra sınıfımızı biraz geliştirelim.

<?php

/**

* dosya dizin işlemleri için sınıf örneği

* @author Murat BEŞER

*

*/

class dosyadizin {

/**

*

* Geçerli dizinimiz.

*

* @var string

*/

protected $dizin;

/**

* Gecerli dizindeki dosya listesi

*

* @var array

*/

protected $dosyalar = array();

/**

* geçerli hata kodu

*

* @var integer

*/

private $_hataNo = null;

/**

*

* Hata mesajları

*

* @var array

*/

private $hatalar = array(

0 => 'Dizin adı belirtilmemiş',

1 => 'Dizin Mevcut değil'

);

/**

*

* @param string $dizin

*/

public function __construct($dizin = './') {

$this->setDizin($dizin);

$this->dosyalar = $this->dizinTara($this->dizin);

}

/**

*

* @param string $dizin

* @return boolean/string

*/

public function ayarlaDizin($dizin) {

if (is_dir($dizinAdi)) { // Dizinin varlığını kontrol ediyoruz

return $this->dizin = $dizin; // Dizinin içeriğini alıyoruz.

}

$this->_hataNo = 1;

return false;

}

/**

*

* @return string

*/

public function gosterDizin() {

return $this->dizin;

}

/**

*

* @param string $dizinAdi

* @param string $bilgi

* @return array

*/

public static function dizinTara($dizinAdi = '', $ata = true, $bilgi = true) {

/**

* Döndüreceğimiz değişkeni ve türünü herhangi bir hataya karşın belirliyoruz

*/

$dosyalar = array();

/**

* Gelen dizinin belirtilip belirtilmediniği kontrol ediyoruz.

* Not: Buna ne gerek var diyebilirsiniz ama bazı zamanlar gerekli olabiliyor.

*/

if ($dizinAdi != '') {

$dizinAdi = $this->_dizin;

}

if (is_dir($dizinAdi)) { // Dizinin varlığını kontrol ediyoruz

$dosyalar = scandir($dizinAdi); // Dizinin içeriğini alıyoruz.

} else {

$this->_hataNo = 1;

return $dosyalar;

}

if ($bilgi == false) {

$gecerli = array_search('.', $dosyalar); // arrayımıza ait keyi alıyoruz

$ust = array_search('..', $dosyalar);

/**

* burada !== kullanmamızın sebebi array_search'ün bize aynı zamanda

* sıfır anahtarına sahip elementide döndürebiliyor olmasından kaynaklı.

*/

if ($current !== false) {

unset($dosyalar[$gecerli]); // gecerli dizini kaldırıyoruz.

}

if ($parent !== false) {

unset($dosyalar[$ust]);

}

}

if ($ata == true) {

$this->dosyalar = $dosyalar;

}

return $dosyalar; // değişkeni geri döndürüyoruz.

}

/**

* Hata mesajlarını belirler

*

* @param array/integer $id

* @param value            $key

* @return boolean/array

*/

public function hataMesajiBelirle($key, $value) {

if (is_array($key)) {

return $this->hatalar = $key;

} else {

if (key_exists($key)) {

$this->hatalar[$key] = $value;

} else {

return false;

}

}

}

}

?>

Şimdilik bu kadar, saat bayağı geç olmuş :) 20:54 te çokgeç canım. Bir sonraki yazıda sınıfın yapısı hakkında daha detaylı bilgiler vereceğim.  Fonksiyonların ve static 'in kullanımı üzerinde duracağız.

22Oca/090

Türkçe’leşen PHP Manual

Bir önceki yazımda Genel Script'ing bilgisi vereceğimi bahsetmişim.  Fakat php.net içerisinde yeni baştan çok güzel bir dökümantasyonla birlikte Türkçe'leştirme çalışması olduğunu fark ettim. Bu gerçekten sevindirici bir konu.

PHP ye yeni başlayan arkadaşlar lütfen Dil Başvuru Kılavuzunu bir okusunlar

http://www.php.net/manual/tr incelenmesinde fayda görüyorum.

22Oca/090

Eksiklik

Hepimiz okul hayatına ilk okul veya ilköğretim ile başlamıştır sonrasında  lise veya orta okul ve ardından üniversite ? Peki benim bir çok forumda gördüğüm soruları soran kişilerin çoğu PHP'yi daha tam olarak öğrenmeyi bırakın PHP ile HTML arasındaki farkı bile bilmeden sorulan sorular görüyorum.

Bir çok kişiye kullandıkları methodlar hakkında yorum yaptığımızda ise "ben sizin kadar iyi bilmiyorum" veya "herkes sizin kadar iyi bilmiyor" cevaplarıyla karşılaşıyoruz.  Bizim amacımız size bu işi öğrenmeniz için yardımcı olmak. Bilgilerimizi ve fikirlerimizi paylaşmak...

Neyse, bu konunun gün geçtikce daha fazla çoğalacağını düşündüğüm için hepinizinde tahmin edeceği sebebten bıraktığım PHP Başlangıç Dersleri serisine kaldığım yerden devam ediyorum.

Umarım insanlar alfebe'yi öğrenmeden kelime ve cümle kurmaya kalkışmazlar artık.

iyi günler.