07.12.2016 Views

fil-dergi-sayi6

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

KÜNYE<br />

Yayıncı<br />

Editör<br />

Tasarım<br />

Logo<br />

Kapak Fotoğrafı<br />

: PHP-TR.com<br />

: Ayhan Barış<br />

: Tolga Dedebek<br />

: Emin Zeybek<br />

: Stefan Koopmanschap<br />

Yazarlar :<br />

Ceyda Anıl<br />

Eray Usta<br />

Fatih Soysal<br />

Hüseyin Akdoğan<br />

Musa Avcı<br />

Sercan Eraslan<br />

Mobil Uygulamalar :<br />

Ahmet Ertekin<br />

Ali Çetin<br />

Orhan Gazi Başlı<br />

Seyhan Yılmaz<br />

Facebook<br />

: groups/tr.developers<br />

Twitter : @php_tr / #phptr<br />

https://play.google.com/store/apps/details?id=com.phptr.<strong>dergi</strong>&hl=tr<br />

Android uygulaması e-<strong>dergi</strong> sayılarının listesini veren ve e-<strong>dergi</strong>yi indirmenizi<br />

sağlayan bir arayüz sunar.<br />

https://itunes.apple.com/us/app/<strong>fil</strong>-php-tr/id788316891<br />

IOS uygulaması e-<strong>dergi</strong> sayılarının listesini veren ve e-<strong>dergi</strong>yi indirmenizi<br />

sağlayan bir arayüz sunar.


http://www.php-tr.com<br />

1<br />

http://<strong>fil</strong>.php-tr.com<br />

http://forum.php-tr.com


2<br />

Magento ürünlerde, kategorilerde değişiklik<br />

yaptığınızda (URL değiştirme, URL redirect<br />

etme vs), kampanya tanımladığınızda, çeşitli<br />

ürün gruplarına indirim yaptığınızda reindex<br />

e ihtiyaç duyar. Magento’da System > Index<br />

Management bölümünde reindex e ihtiyaç<br />

duyan kısımları görebilirsiniz.<br />

Şekil 1 – Flat data kullanmayan reindex istemeyen sistemin<br />

ekran görüntüsü<br />

Burda doğrudan tamamını seçip üstteki<br />

bölümden reindex data yapabilirsiniz. Bu<br />

yöntem bazen sistemi zorlamakta ve kasmalara<br />

sebebiyet verebilmektedir. Özellikle ürün sayınız<br />

10K (10bin) üzerine çıkmış ise bu kasmayı haliyle<br />

tespit edebilirsiniz. İşte bu noktada aşağıda<br />

anlatmış olduğum 2 türlü yöntem size hız<br />

kazandıracaktır.<br />

REINDEX YÖNTEMLERİ<br />

// magentoda flat datalar açık ise 9 process<br />

vardır bunların<br />

// idleri 1 den 9 a kadardır. Flat data açık<br />

değil ise 7 adettir<br />

// (Şekil 1 ve 2 de farkı görebilirsiniz)<br />

// Bazı eklentiler bu bölüme indexlenmesi<br />

gereken bölümlerini koyabiliyor<br />

// üzerine tıkladığınızda /index.php/admin/<br />

process/edit/process/9<br />

// link yolundan id sini de görebilir ve<br />

aşağıdaki kısıma ekleyebilirsiniz.<br />

$ids = array(1,2,3,4,5,6,7,8,9);<br />

foreach($ids as $id)<br />

{<br />

//id lere göre index mekanizmasını başlat<br />

try<br />

{<br />

$process = Mage::getModel(‘index/process’)-<br />

>load($id);<br />

$process->reindexAll();<br />

echo “Indexing for Process ID # “.$id.” ”;<br />

}<br />

catch(Exception $e)<br />

{<br />

echo $e->getMessage();<br />

}<br />

}<br />

?><br />

Şekil 2 – Reindex ihtiyacı olan sistemin ekran görüntüsü<br />

1) Kod ve Cron ile yapmanın yolu<br />

Aşağıdaki kodları bir php dosyasına yazıp<br />

magento ana dizininize atıp bunu bir cron<br />

a bağlayıp belli aralıklarla çalışmalarını<br />

sağlayabilirsiniz.<br />


3<br />

Şekil 2 de gördüğünüz gibi zaten size kırmızı<br />

ile işaretleyerek indexlenmesi gereken kısımları<br />

göstermektedir. Dilerseniz full index yerine parça<br />

parça da atabilirsiniz. Bahsettiğimiz bölüm için<br />

örnek verecek olursak;<br />

Eray Usta<br />

php indexer.php --reindex catalog_url<br />

Diğer bölümlere erişmek için ise;<br />

http://erayusta.com<br />

@erayusta<br />

php -f indexer.php help<br />

Komutundan yararlanabilir veya indexlenecek<br />

alanların kontrolü için ise<br />

php -f indexer.php info<br />

Komutunu kullanabilirsiniz. Ayrıca tüm bölümler<br />

için ise aşağıdaki kodlardan yararlanabilirsiniz.<br />

catalog_product_attribute<br />

Product Attributes<br />

catalog_product_price Product Prices<br />

catalog_url Catalog Url Rewrites<br />

catalog_product_flat Product Flat Data<br />

catalog_category_flat Category Flat Data<br />

catalog_category_product Category Products<br />

catalogsearch_fulltext Catalog Search Index<br />

cataloginventory_stock Stock status<br />

tag_summary Tag Aggregation Data<br />

php indexer.php --reindex<br />

catalog_product_attribute<br />

php indexer.php --reindex<br />

catalog_product_price<br />

php indexer.php --reindex catalog_url<br />

php indexer.php --reindex catalog_product_flat<br />

php indexer.php --reindex catalog_category_flat<br />

php indexer.php --reindex<br />

catalog_category_product<br />

php indexer.php --reindex<br />

catalogsearch_fulltext<br />

php indexer.php --reindex<br />

cataloginventory_stock<br />

php indexer.php --reindex tag_summary<br />

Not: Magento hakkında detaylı bilgi almak<br />

isterseniz <strong>dergi</strong>nin Kasım ayı sayısında bir<br />

arkadaşımız magento ile ilgili detaylı bilgi<br />

vermişti.


4<br />

PHP’DE SINIF/<br />

CLASS YAPISI<br />

VE NYP-2<br />

Bir önceki yazımızda son olarak, PHP sınıfları içinde<br />

public erişim belirtecine sahip olmayan nesne<br />

özelliklerine gerek gördüğümüzde nasıl erişir,<br />

değer ataması yapabilir ve değer okuyabiliriz<br />

sorusunda kalmıştık.<br />

O yazıda da belirttiğim gibi bu sorunun cevabı,<br />

sınıf/nesnelerimizi işlevsel hale getirdiğini daha<br />

önce belirttiğimiz metodlar ve kullanımlarındadır.<br />

Birazdan örneklendireceğimiz kullanım, bir NYP<br />

kavramı olan “sarmalama / encapsulation”<br />

dır. Sarmalama, kısaca özellik/metodların erişim<br />

yapısının belirlenmesidir. Örneğimizde yazar<br />

özelliğini, erişimin sadece sınıf içinden sağlanması<br />

adına private erişim belirteci ile deklare ettik.<br />

Ancak aynı değişkene kodun akışı içinde gerekli<br />

olduğunda okumak ve yeni değer atamak<br />

için erişmemiz gerekiyor. Bu sorunu, söz konusu<br />

değişkene erişimi sağlayacak işlevsel metodlarla<br />

aşacağız.<br />

Örnek kod üzerinden irdeleyelim.<br />

class makaleler {<br />

var $kategori;<br />

var $baslik;<br />

private $yazar;<br />

public $yayin_tarihi;<br />

function yeniMetod($kategori, $baslik,<br />

$yazar, $yayin_tarihi){<br />

$this -> kategori = $kategori;<br />

$this -> baslik = $baslik;<br />

$this -> yazar = $yazar;<br />

$this -> yayin_tarihi = $yayin_tarihi;<br />

}<br />

/*yazar değişkenine<br />

değer atamak için<br />

kullanacağımız metod<br />

*/<br />

function setYazar($yazar){<br />

$this -> yazar = $yazar;<br />

}<br />

}<br />

$yeni_yazi = new makaleler;<br />

$yeni_yazi -> yeniMetod(“PHP”, “PHP’de sınıf/<br />

class yapısı ve NYP-2”, “Hüseyin Akdoğan”,<br />

“10.05.2011”);<br />

$yeni_yazi->setYazar<br />

}<br />

= “Ahmet oğlu Mehmet”;<br />

Kodda “setYazar” isimli metod dikkatinizi<br />

çekmiştir, işte private erişim belirtecine<br />

sahip nesne özelliğine değer atamak için<br />

kullanacağımız metod bu metottur çünkü söz<br />

konusu özelliğe sınıf dışından değer atayamıyor<br />

ve okuyamıyoruz.<br />

Değer atamasını yaptığımız satıra baktığımızda,<br />

işleyişin daha önce örneklerini gördüğüklerimizden<br />

hiçbir farkı bulunmadığını görürüz.<br />

$yeni_yazi->setYazar(“Ahmet oğlu Mehmet”);<br />

Bu aşamadan sonra, yeni_yazi değişkeninin<br />

bir örneğine sahip olduğu makale nesnesinin<br />

yazar özelliği “Ahmet oğlu Mehmet” değerini<br />

taşıyacaktır. Bu değeri okumak içinde aynı<br />

yönteme başvuracağız çünkü erişmeye<br />

çalışacağımız özellik private erişim belirtecine<br />

sahip olduğundan “echo $yeni_yazi->yazar;”<br />

şeklinde bir kullanım söz konusu olamayacaktır.<br />

function getYazar(){<br />

return $this -> yazar;<br />

}<br />

echo $yeni_yazi->getYazar();<br />

Ahmet oğlu Mehmet<br />

Bu örneklerden hareketle, metodların sınıflarımız<br />

üzerinde bize sağladığı kontrol gücü hakkında<br />

bir fikir edinebildiğinizi umuyorum. Bu kontrol


5<br />

gücü bize aynı zamanda “işlevsellik” noktasında<br />

da fikir vermektedir. Tekrar belirtmeliyim ki<br />

örneklendirdiğimiz şey, bir NYP kavramı olan<br />

“sarmalama / encapsulation” dır. Yukarıda<br />

söylediğimiz gibi bu kavram, kısaca özellik /<br />

metodların erişim yapısının belirlenmesini ifade<br />

etmektedir. Örneğimizde, yazar özelliğini private<br />

erişim belirteci ile deklare ederek, bu özelliğe sınıf<br />

dışından erişimi engelledik ve söz konusu özelliğin<br />

okunması ve değer ataması için 2 ayrı metod<br />

kullandık, yani onu sarmaladık.<br />

Kalıtım/Inheritance<br />

Bir başka NYP kavramı olan kalıtım kısaca, bir<br />

sınıfın bir başka sınıftan türemesidir. Bu türemiş<br />

sınıf, kendisinden türediği sınıftan özellik ve<br />

metodları miras almaktadır ki, kalıtım konusunda<br />

en önemli kavram, bu miras kavramıdır.<br />

Konuyu kavramak için yine bir örneğe müracat<br />

edelim.<br />

class uni {<br />

var $adi = “Kodcu.Com Yazılım Üniversitesi”;<br />

var $mekan = “Sanal Alem”;<br />

}<br />

class fakulte extends uni {<br />

var $bolumadi;<br />

}<br />

function __construct($bolumadi){<br />

$this -> bolumadi = $bolumadi;<br />

}<br />

$bolum = new fakulte(“Yazılım Mühendisliği”);<br />

echo “Okulu: “.$bolum->adi.” Fakültesi:<br />

“.$bolum->bolumadi. “ Mekan: “.$bolum->mekan;<br />

Kodu hızlıca incelediğimizde, “uni” ve “fakulte”<br />

adında 2 ayrı sınıfımız olup, fakulte sınıfının “extends”<br />

anahtarı ile oluşturulduğunu göreceğiz.<br />

class fakulte extends uni<br />

Buradan da anlayabileceğiniz gibi, bir sınıf<br />

bir başka sınıftan türetildiğinde bu extends<br />

anahtar sözcüğü ile yukarıda görüldüğü<br />

gibi yapılmaktadır. Uni sınıfı/nesnesi içinde her<br />

hangi bir metod olmamakla birlikte iki özelliğin<br />

deklare edilip, değer ataması yapıldığını<br />

görüyoruz. Fakulte sınıfı/nesnesi içinde ise “bolumadi”<br />

adında tek bir özellik ile bir yapılandırıcı<br />

metodumuz bulunduğunu ve bu metod<br />

içinde, metoda geçirilen değerin sınıf/nesne<br />

özelliğine atandığı/set edildiğini görüyoruz.<br />

Kodumuzda kalıtım ve miras konusu için<br />

aydınlatıcı satır<br />

echo “Okulu: “.$bolum->adi.” Fakültesi:<br />

“.$bolum->bolumadi. “ Mekan: “.$bolum->mekan;<br />

yukarıdaki satırdır. Bu satırda “$bolum->adi”<br />

ve “$bolum->mekan” şeklinde, aslında fakulte<br />

sınıfı/nesnesi içinde tanımlamadığımız özelliklere<br />

erişmeye çalışıyoruz. Kodumuzu çalıştırdığımızda<br />

bizi aşağıdaki çıktı karşılayacaktır.<br />

Okulu: Kodcu.Com Yazılım Üniversitesi Fakültesi:<br />

Yazılım Mühendisliği Mekan: Sanal Alem<br />

“$bolum->adi” ve “$bolum->mekan” ile<br />

eriştiğimizi yukarıdaki çıktıda gördüğümüz<br />

özellikler, uni sınıfı/nesnesinin “adi” ve “mekan”<br />

özellikleridir. İşte kalıtım ve miras tam da burada<br />

gördüğümüz gibi, fakulte sınıfı/nesnesinin,<br />

kendisinden türediği uni sınıfı/nesnesi içinde yer<br />

alan bu iki özelliği miras almasıdır.<br />

Bir başka değiş ile, türetilen sınıflar, kendilerinden<br />

türedikleri sınıfların özellik ve metodlarını miras<br />

alırlar.<br />

Bir başka örnek.<br />

class uni {<br />

var $adi = “Kodcu.Com Yazılım Üniversitesi”;<br />

var $mekan = “Sanal Alem”;<br />

}<br />

class fakulte extends uni {<br />

var $bolumadi=”Yazılım Mühendisliği”;<br />

}<br />

function info(){<br />

echo “Fakulte sınıfının içindeyiz...»;<br />

}<br />

class ogrenci extends fakulte{<br />

var $ogrenci_kimligi;<br />

function __construct($ogrenci_kimligi){<br />

$this -> ogrenci_kimligi = $ogrenci_<br />

kimligi;<br />

}<br />

}<br />

$ogrenci = new ogrenci(“Hüseyin Akdoğan”);<br />

$ogrenci->info();<br />

Bir önceki örneğimizi biraz değiştirerek oluşturduğumuz<br />

kodda, fakulte sınıfına “info” isimli<br />

bir metod eklediğimizi ve aynı sınıftan “ogrenci”<br />

adında bir sınıf türettiğimizi görüyoruz.<br />

$ogrenci->info();<br />

Bu satırda ise, ogrenci sınıfının kendisinden<br />

türediği fakulte sınıfının “info” isimli metodunun


6<br />

çağrıldığını görüyoruz. Kodumuzu çalıştırdığımda<br />

karşılaşacağımız çıktı<br />

Fakulte sınıfının içindeyiz…<br />

olacaktır.<br />

Buradan da, yukarıda söylediğimiz gibi türetilen<br />

sınıfların, kendilerinden türedikleri sınıfların<br />

özellikleri yanı sıra metodlarını da miras aldıklarını<br />

görüyoruz.<br />

Bu ve bir önceki yazımızda kurgulamaya<br />

çalıştığımız nesne modellerinin, çok boyutlu<br />

ve özellikle veritabanı ile etkileşimli bir kayıt<br />

sisteminde, kodlayıcıya sağladığı avantajlar<br />

tartışılmazdır. NYP yaklaşımının, programlayıcıya<br />

sağladığı avantajları kısaca saymamız gerekirse<br />

bunları şu şekilde özetleyebiliriz.<br />

• NYP yaklaşımı, tasarlanacak kod ile gerçek<br />

yaşam arasında akli bir bağ kurarak, tutarlı<br />

ve sağlam modellemeler kurulmasını<br />

kolaylaştırmaktadır.<br />

• NYP yaklaşımı ile değişken ve metod/<br />

fonksiyonlar arası ilişkiler, tasarlanan nesnenin<br />

depolama özelliğine yüklenmiş ve programcı<br />

bu ilişkiler yükünden kurtulmuştur.<br />

• NYP yaklaşımında kalıtım sayesinde, geliştirilen<br />

kod farklı amaçlar için genişletilebilmekte,<br />

ek özellikler alabilmekte ve bu kodun<br />

ana iskeletini bozmadan/değiştirmeden<br />

gerçekleştirilebilmektedir.<br />

• NYP yaklaşımında yazılan kodun okunabilirlik<br />

ve anlaşılabilirlik oranı yükselmekte,<br />

buda özellikle ekip çalışması ile geliştirilen<br />

kod geliştirme süreçlerine ciddi katkı<br />

sağlamaktadır.<br />

PHP ile NYP konusunu işlemeye devam edeceğiz.<br />

Not: PHP’de fonksiyonların yapı ve kullanımı,<br />

son iki yazımızda gördüğünüz metod ve<br />

kullanımları(yapılandırıcı/construct metodların<br />

çalışma prensibi hariç) ile aynıdır. Dikkatinizi çekmiştir<br />

ki, sınıflar içinde yer alan metodlar “function“<br />

anahtarı ile deklare edilmektedir. Bir başka değiş<br />

ile, fonskiyonlar sınıflar içinde yer aldığında “metod”<br />

olarak adlandırılmaktadır.<br />

Hüseyin Akdoğan<br />

http://kodcu.com


7<br />

fonksiyon<br />

kullanımı ve örnekleri<br />

Başlangıç seviyesinin son dersi olan fonksiyonlar bir<br />

şeyler inşa etmeye başlamamız için öğrenmemiz<br />

gereken en harika derslerden birisi. Teorik olarak<br />

matematik dersinde gördüğümüz fonksiyonlar<br />

gibidir.<br />

Oluşturduğumuz bir değişken ve içine yazdığımız<br />

kodları istediğimiz yerde tanımladığımız<br />

fonksiyonun adıyla çalıştırıp tekrar tekrar<br />

kullanabiliyoruz.<br />

Gerek çalışmalarımızda çok sık tekrar edeceğimiz<br />

kodları bir yerde paket haline getirip bir fonksiyon<br />

adıyla çağırmak için, gerekse işe yarar kodları<br />

belli başlıklar altında derleyip düzenli çalışmalar<br />

yapmak için göz bebeğimiz olan fonksiyonları<br />

öğrenmeye hazır olun.<br />

PHP Fonksiyon Kullanımı<br />

PHP’nin kendi içinde yüzlerce fonksiyonu vardır.<br />

Diğer derslerde gördüğümüz isset(), empty(),<br />

unset() gibi. Fonksiyon oluşturmak ve kullanmak<br />

gayet basit, ama basit olduğu gibi derin konuları<br />

da var.<br />

İlk önce nasıl bir fonksiyon oluşturacağımızı<br />

gösterelim:<br />

function selam_ver() {<br />

echo ‘Selam!’;<br />

}<br />

Yukarıda selam_ver() adında bir fonksiyon<br />

oluşturduk. Bu şekilde bir kodu çalıştırsak ekrana<br />

bir çıktı vermez. Çünkü şuan sadece bir fonksiyon<br />

tanımladık, içine yazılan kodların çalışması için o<br />

fonksiyonu çağırmamız gerekiyor.<br />

Hemen bu fonksiyonun altına selam_ver();<br />

yazacak olursak eğer, işte o zaman ekranda<br />

Selam! yazar.<br />

Hemen başka bir örnek daha verelim:<br />

function rakamlar() {<br />

for($sayi = 0; $sayi


8<br />

Parametreli fonksiyona bir başka örnek daha<br />

verelim:<br />

function bolunur_mu($bu, $buna) {<br />

$kalan = $bu % $buna;<br />

if($kalan == 0) {<br />

echo $bu . ‘ sayısı ‘ . $buna . ‘ sayısına<br />

bölünür!’;<br />

} else {<br />

echo $bu . ‘ sayısı ‘ . $buna . ‘ sayısına<br />

bölünmez! (kalan: ‘.$kalan.’)’;<br />

}<br />

}<br />

bolunur_mu(10, 2);<br />

bolunur_mu(25, 10);<br />

İki rakamın birbirine bölünüp bölünmediğini<br />

kontrol eden bir fonksiyon yaptık. Ve bu<br />

fonksiyonu 2 farklı değerde kullanıp çağırdık. Bu<br />

çalışmanın sonunda ekranda yazacak olanlar:<br />

10 sayısı 2 sayısına bölünür!<br />

25 sayısı 10 sayısına bölünmez! (kalan: 5)<br />

Parametrelere Varsayılan Değer Verme<br />

Parametreli bir fonksiyon yaptığımızda sorunsuz<br />

çalışabilmesi için tüm parametrelerin girilmesi<br />

gerekir. Mesela yukarıda verdiğimiz topla<br />

fonksiyonunu topla(1); şeklinde çalışmaya<br />

kalktığımızda PHP hata verecektir.<br />

Çünkü fonksiyonu 2 tane parametre ile çalışmak<br />

üzere tasarladık. Ama bu durumlara bir istisna<br />

sağlayarak parametrelerimize varsayılan<br />

değer atayıp, parametresiz de çalışmalarını<br />

sağlayabiliriz.<br />

Şimdi varsayılan parametreli bir fonksiyon<br />

yapalım:<br />

function hosgeldin($isim = ‘Misafir’) {<br />

echo ‘Hoşgeldin ‘ . $isim . ‘! ‘;<br />

}<br />

hosgeldin();<br />

hosgeldin(‘Musa’);<br />

Örnekte hosgeldin() fonksiyonunu ilk olarak<br />

parametresiz, ikinci olarak da parametreli<br />

çalıştırdık. Bu durumda fonksiyonun parametresini<br />

tanımladığımız yerde hosgeldin($isim =<br />

‘misafir’) şeklinde parametreye varsayılan<br />

değer atadığımız için boş bıraktığımızda o<br />

parametreye bu değeri verecektir. Yani ekranın<br />

çıktısı aşağıdaki gibi olacaktır:<br />

Hoşgeldin Misafir!<br />

Hoşgeldin Musa!<br />

Return İfadesi İle Sonucu Atama<br />

Yukarıda yaptığımız tüm örneklerde fonksiyon<br />

sonuçları echo ile ekrana yazdırdık. Peki ya<br />

biz fonksiyonlardan elde ettiğimiz sonuçları<br />

ekrana yazdırmak değilde bir değişkene atayıp<br />

kullanmak istiyorsak? İşte o zaman return ifadesini<br />

kullanacağız.<br />

Return ifadesi ile fonksiyon içinde elde ettiğimiz<br />

sonucu dışarıya aktarırız. Hemen bir örnek ile<br />

hayata geçirelim:<br />

function topla($sayi1, $sayi2) {<br />

$sonuc = $sayi1 + $sayi2;<br />

return $sonuc;<br />

}<br />

$hesap = topla(10, 20);<br />

echo ‘Fonksiyon ile toplama yaptık ve sonuç: ‘<br />

. $hesap;<br />

İşte yukarıdaki örnekte gördüğün gibi bu sefer<br />

aynı topla() fonksiyonu ile echo yerine return<br />

yazdık. Bu da fonksiyonun sonucunu ona<br />

eşitlediğimiz bir değişkene atadı. Yani fonksiyon<br />

toplamayı yaptı ve sonucu $hesap değişkenine<br />

aktardı sonra biz onu echo ile ekrana yazdırdık.<br />

Fonksiyonlarda Global İfadesi Kullanımı Ve<br />

Örneği<br />

Fonksiyonların içerisinde tanımladığın değişkenler<br />

dışarıya gönderilmez ve aynı şekilde dışarıda<br />

tanımladığın bir değişken fonksiyon içinde<br />

görülmez. Yani fonksiyonlara kendi içinde bir<br />

dünya diyebilirsin. Hemen örnek ile kafanda<br />

canlandıralım:<br />

function deneme() {<br />

$isim = ‘Musa’;<br />

}<br />

deneme();<br />

echo $isim;<br />

Bu kodu çalıştırdığımızda PHP yalnızca isim<br />

adında bir değişken olmadığı için hata verir. Biz<br />

$isim değişkenini fonksiyon içinde tanımladık ve<br />

yalnızca orada kullanabiliriz. Dışarıya aktarmak<br />

için return ifadesini kullanıyoruz.<br />

Eğer fonksiyon içine dışarıdan bir değişkeni<br />

sokmak istiyorsak, yani global bir değişkeni<br />

çağırmak istiyorsak global ifadesini kullanırız.<br />

$isim = ‘Musa’;<br />

function selam() {<br />

global $isim; // Dışarıda tanımlanmış bir<br />

değişkeni fonksiyon içine çağırdık


9<br />

echo ‘Selam ‘ . $isim;<br />

}<br />

selam();<br />

Ekranda Selam Musa yazar. Global ifadesini<br />

kullanarak fonksiyon dışında yazdığımız bir<br />

değişkeni çağırdık ve ekrana yazdırdık.<br />

Return ifadesi kullanılmadan fonksiyon içindeki bir<br />

değişkeni veya çıktıyı dışarı aktaramayız. Global<br />

ifadesi kullanılmadan da dışarıda kullanılan bir<br />

değişkeni fonksiyon içine aktaramayız.<br />

Fonksiyonlarda Referans İle Değer Atama<br />

Return İfadesini Kullanarak Değer Atama<br />

yaparken fonksiyonun başında bir değişkeni<br />

ona atamak için (=) eşittir operatörünü kullanırız.<br />

Peki dikkatini çekti mi bilmiyorum ama dizilerde<br />

sıralama yapan fonksiyonları (sort(), rsort()) bu<br />

şekilde kullanmıyorduk.<br />

Sadece fonksiyonu çalıştırarak dışarıdan<br />

parametreye gönderilen değişkenin değerini<br />

referanslar ile değiştirebiliriz.<br />

Referans uygulamak istediğimiz değişkenin<br />

başına (&) operatörünü koyarız. Bu operatörü<br />

yerleştirdiğimiz parametreler, dışarıdan verilecek<br />

olan değişkenlerle beraber değişirler.<br />

function topla(&$sayi) {<br />

$sayi = $sayi + 10;<br />

}<br />

$x = 10;<br />

topla($x);<br />

echo $x;<br />

Ekranda 20 yazar. Topla fonksiyonunun<br />

parametresinde kullandığımız referans nedeniyle<br />

o parametreye yüklenen değişkenin değeri<br />

fonksiyon içinde değiştirmemizle değişecek.<br />

Burada da fonksiyon içinde o parametreye +10<br />

eklediğimiz için dışarıdaki değişkeninde değeri<br />

10 artmış oldu.<br />

Musa Avcı<br />

@musa_avci<br />

www.phpr.org


Programcı mısın yoksa<br />

Yazılım Geliştirici misin?<br />

Yazılımla ilgilenenleri düşündüğümüzde yazılımcı demek mantıklı geliyor olsa da, aslında hiçbir<br />

yazılımcı birbirine benzemez. Günümüzün tartışmalı konularından biri de Programcı ile Yazılım<br />

Geliştirici arasındaki farklılıklardır.<br />

Yazılım Geliştirme Uzmanı aradığınızı düşünürken aslında ihtiyaç duyduğunuz kişi bir programcı<br />

olabilir. Aynı şekilde açık pozisyonunuzun programcı olduğuna karar verip yazılım geliştiriciyi işe<br />

alırsanız sonradan problemlerle karşılaşabilirsiniz.<br />

Peki, yazılım geliştirici ve programcı kimdir?<br />

Yazılım Geliştirici kimdir?<br />

1. Algoritma yaratmak ister ve algoritma yaratmaktan büyük keyif alır.<br />

2. İhtiyaca yönelik çözümleri planlar ve uygulamaya geçirir.<br />

3. Kodun nasıl geliştirileceğini, nelerin düzenlenmesi gerektiğini araştırır ve dener.<br />

4. Mevcut ürünün güçlü ve zayıf yönlerini değerlendirir, test eder.<br />

5. Yazılım geliştirici, yalnızca var olan kodu yazmak istemez.<br />

6. Farklı sistemleri ve yazılım dillerini kullanır.<br />

7. Örnek kodları yazmak yerine kodlar üretir.<br />

8. Farklı frameworkleri kullanmak ve denemek ister, hatta kendi oluşturduğu frameworkleri<br />

vardır.<br />

Eğer yazılım geliştiricisine yalnızca belirli kodları verip yazdırmak isterseniz, çok geçmeden bu kişileri<br />

kaybedersiniz.<br />

10


Programcı kimdir?<br />

1. Programcı kodun önce algoritmasını anlar,<br />

2. Projenin ihtiyacına göre hangi kodun yazılacağını bilir.<br />

3. Kodu yazmadan önce sağlam ve verimli olacak kod yapısını bilir,<br />

4. Kodun doğru ve sağlam olduğunu anlamak için testler gerçekleştirir.<br />

5. Her yazılım dili hakkında bilgi sahibidir.<br />

6. Programcı, var olan projede kodun hatasız yazılmasından kendisini sorumlu hisseder.<br />

7. Verilen kodu eksiksiz girmek ve yazmak ister.<br />

8. Bulunduğu projede kodu hayata geçiren olmaktan büyük zevk duyar.<br />

Eğer programcıya proje üret ve kendin araştırmalar<br />

yap derseniz mutsuz olur. Israr ederseniz ekibinizde fazla<br />

kalmayacaktır.<br />

Programcı ve yazılım geliştirici arasındaki farklılıkların ayırt<br />

edilmesi hem yazılımcı hem de şirketler açısından önemli.<br />

Programcı görev insanıyken, geliştirici projeleri yaratan<br />

kişidir. Programcı kodu hayata geçirirken, geliştirici kodu<br />

geliştirmek ister. Bu nedenle birbirlerinden ayrılır.<br />

Yazılımcı kendisinin programcı mı yoksa geliştirici mi olduğuna karar verip bu yönde kendisi için<br />

uygun olacak çalışmalarda bulunmalıdır.<br />

Şirketlerin yaptığı en büyük hata, ekibinde gerekli olan kişiyi bir türlü nitelendirememesi, nasıl bir<br />

kişiye ihtiyacı olduğunu bilmemesidir. Belirsizliğin en büyük kanıtı iş ilanlarındaki tutarsızlıklar ve IT<br />

departmanı içerisindeki sirkülasyondur.<br />

En çok yaşanılan problemlerden biri de yazılımcıdan beklenilen ile yazılımcının çalışma tarzının<br />

birbiriyle örtüşmemesidir. Yazılım geliştiricisini ekibinizden hızlıca uzaklaştırmak istiyorsanız örnek<br />

kodlar verip yazmasını isteyin. Programcıyı uzaklaştırmak istiyorsanız araştırma yapmasını ve proje<br />

üretmesini isteyin.<br />

Firmaların küçük ya da büyük ölçekli olmasına, start-up ya da kurumsal olmasına ve çıkartılan<br />

projelere göre IT departmanındaki programcı ve geliştirici sayısı değişkenlik gösterir. Unutmayın,<br />

programcı olmadan yazılım düzgün ve doğru yazılmayacağı gibi, geliştirici olmadan da kod ve<br />

proje gelişemez!<br />

Ceyda Anıl<br />

www.ceydaanil.com<br />

E-nerjik<br />

11


CANVAS<br />

+<br />

SVG<br />

elemanı web sayfasına grafik<br />

çizmek için genellikle JavaScript ile kullanılır.<br />

“height” ve “width” öznitelikleri ile<br />

çizilebilir bir alan oluşturur. Canvas çizmek için<br />

kullanılan metodlar: kutular, daireler, karakterler,<br />

görseller(images) ve dahası.<br />

elemanını tanımlarken “id”, “width”<br />

ve “height” öznitelikleri verilmelidir.<br />

<br />

JavaScript ile Çizim<br />

Aşağıdaki iki satır, kırmızı bir dikdörtgen çizer:<br />

ctx.<strong>fil</strong>lStyle=”#FF0000”;<br />

ctx.<strong>fil</strong>lRect(0,0,150,75);<br />

<strong>fil</strong>lStyle özniteliği rengi kırmız yapar, <strong>fil</strong>lRect ise<br />

şeklini, konumunu ve boyutunu belirler. ilk iki değer<br />

yukarıda ve soldan olan mesafeyi ayarlar son iki<br />

değer ise oluşturduğumuz kutunun genişliğini ve<br />

yüksekliğini belirler.<br />

Örnek 1:<br />

elemanının kendi çizim yetenekleri<br />

yoktur. Tüm çizimler JavaScript içinde yapılır.<br />

12<br />

<br />

var a = document.getElementById(“myCanvas”);<br />

var ctx = a.getContext(“2d”);<br />

ctx.<strong>fil</strong>lStyle=”#FF0000”;<br />

ctx.<strong>fil</strong>lRect(0,0,150,75);<br />

<br />

JavaScript, id kullanarak elemanını<br />

bulur.<br />

var a=document.getElementById(“myCanvas”);<br />

Sonra bir içerik nesnesi oluşturur. GetContext(“2d”)<br />

nesnesi yerleşik bir HTML5 nesnesidir.<br />

var ctx = a.getContext(“2d”);<br />

<br />

Tarayıcınız canvas elemanını desteklemiyor.<br />

<br />

<br />

var a=document.getElementById(“myCanvas”);<br />

var ctx=a.getContext(“2d”);<br />

ctx.moveTo(10,10);<br />

ctx.lineTo(150,50);<br />

ctx.lineTo(10,50);<br />

ctx.stroke();<br />


Örnek 2:<br />

HTML İçinde SVG<br />

Direk olarak HTML sayfasının içine dahil edilebilir.<br />

Örneği görelim;<br />

<br />

Tarayıcınız canvas elemanını desteklemiyor.<br />

<br />

<br />

var a=document.getElementById(“myCanvas2”);<br />

var ctx=a.getContext(“2d”);<br />

ctx.<strong>fil</strong>lStyle=”#FF0000”;<br />

ctx.beginPath();<br />

ctx.arc(70,18,15,0,Math.PI*2,true);<br />

ctx.closePath();<br />

ctx.<strong>fil</strong>l();<br />

<br />

HTML5 Inline SVG<br />

HTML5’in satır içi SVG desteği vardır.<br />

SVG Nedir?<br />

• SVG, Ölçeklenebilir Vektör Grafikleri (Scalable<br />

Vector Graphics) anlamına gelir.<br />

• SVG, Web’te vektör tabanlı grafikler<br />

tanımlamak için kullanılır.<br />

• SVG, grafikleri XML formatında tanımlar.<br />

• Yakınlaştırılan veya yeniden boyutlandırılan<br />

(zoom / resize) grafiklerde herhangi bir kalite<br />

kaybı olmaz.<br />

• Her eleman ve her öznitelik SVG dosyalarında<br />

animasyon olarak kullanılabilir.<br />

• SVG, W3C tarafından önerilmektedir.<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

SVG Avantajları<br />

13<br />

• SVG görselleri (images), herhangi bir metin<br />

editöründe oluşturulabilir ve düzenlenebilir.<br />

• SVG görselleri aranabilir, indexlenebilir,<br />

scriptlenebilir ve sıkıştırılabilir.<br />

• SVG görselleri ölçeklenebilir.<br />

• SVG görselleri büyük çözünürlüklerde ve<br />

kalitede yazdırılabilir.<br />

• SVG görselleri bozulma olmadan<br />

yakınlaştırılabilir.<br />

• Gelişmiş tüm tarayıcılar destekler.<br />

Senior Front-End Developer<br />

info@sercaneraslan.com<br />

http://www.sercaneraslan.com<br />

Sercan Eraslan


SQL Bİrden<br />

F a z l a<br />

Tablo İle Çalışmak<br />

Merhabalar sayın okurlar; tekrar birlikteyiz, bugün<br />

veritabanı vizesine girdim ve sizin yararınıza<br />

olacağını düşündüğüm bu önemli konuyu<br />

buraya taşımayı uygun gördüm. SQL’de birden<br />

fazla tablo ile işlem yapmak neden gerekli?<br />

Genellikle veritabanı kayıtları oluşturulurken<br />

(özellikle profesyonel veritabanları) bütün bilgiler<br />

bir tabloda değil de birden çok tablo üzerinde<br />

tutulur, bu tablolar saklanan veri çeşidine<br />

göre birbirinden ayrılır. Böylece verilerimizin<br />

hem düzenli olması sağlanır, hem de gereksiz<br />

veri tekrarları engellenmiş olur. Şimdi, birden<br />

fazla tabloda çalışmamız için ne yapmamız<br />

gerekiyor? SQL bize bu noktada da kolaylık<br />

gösteriyor mu? Aslında tek yapmamız gereken<br />

çalışacağımız veritabanı tablolarımızı SQL<br />

satırlarıyla ilişkilendirmek. Dilerseniz hemen<br />

örneklere geçmek istiyorum. Örnek kodlarımızın<br />

üzerinde açıklamaları mevcuttur. Eğer kafanıza<br />

takılan bir nokta olursa yorum olarak bırakmanız<br />

yeterli. Tüm kodlamaya gönül vermiş arkadaşlara<br />

kolaylıklar, görüşmek üzere...<br />

Örnek 1 :<br />

Hangi personelin ne kadar maaş aldığını<br />

listelemek istersek;<br />

SELECT ad, soyad, aylik_ucret<br />

FROM personel, ucretler<br />

WHERE sicil_no=per_sicil_no<br />

Örnek 2 :<br />

İstanbul’da yaşayan Bursa doğumlu personelin<br />

maaşlarını listelemek istersek;<br />

2000 liradan fazla maaş alan ve 2 nolu meslek<br />

grubuna ait personeli listelemek istersek;<br />

SELECT ad,soyad,aylik_ucret<br />

FROM personel,ucretler<br />

WHERE sicil_no=per_sicil_no AND aylik_<br />

ucret>2000 AND meslek_id=2<br />

Örnek 4 :<br />

Muhasebe meslek grubuna ait personel listesi;<br />

SELECT ad,soyad<br />

FROM personel,meslekler<br />

WHERE meslek_id=meslek_id AND meslek_<br />

aciklama=’Muhasebe’<br />

Şimdi buradaki sorgulamımızda bir karışıklık söz<br />

konusu olacak.İki tane aynı isimde meslek_id<br />

oldu. Bunu şu şekilde engelleyebiliriz.<br />

Tablolarda aynı isimde iki kolon varsa bu kolanları<br />

kullanırken başlarıda tablo ismini getiririz araya<br />

bir nokta koyarak kolon adını yazarız.<br />

SELECT ad, soyad<br />

FROM personel,meslekler<br />

WHERE personel.meslek_id=meslekler.<br />

meslek_id<br />

AND meslek_aciklama=’Muhasebe’<br />

Örnek 5 :<br />

Şirketimizde 30 yıldır çalışan ve 2000 lira altında<br />

maaş alan personeli ödüllendireceğiz.<br />

14<br />

SELECT ad,soyad,aylik_ucret<br />

FROM personel,ucretler<br />

WHERE sicil_no=per_sicil_no AND adres LIKE<br />

‘%İstanbul%’ AND<br />

dogum_yeri = ‘Bursa’<br />

Örnek 3 :<br />

Bunun için nasıl bir sorgulama yapmalıyız.<br />

SELECT ad,soyad<br />

FROM personel,ucretler<br />

WHERE sicil_no=per_sicil_no AND baslama_<br />

tarihi < ‘01.01.1969’<br />

AND aylik_ucret < 2000


Örnek 6 :<br />

22 yaşından büyük bilgi işlemde çalışan bayan<br />

personeli listelemek istersek<br />

(NOT : cinsiyet= 0 : bayan 1 : erkek<br />

medeni_hal= 0 : bekar 1 : evli)<br />

SELECT ad,soyad<br />

FROM personel,meslekler<br />

WHERE personel.meslek_id=meslekler.<br />

meslek_id<br />

AND meslek_aciklama=’Bilgi İşlem’ AND<br />

cinsiyet=0<br />

AND dogum_tarihi < ‘01.01.1977’<br />

Örnek 7 :<br />

40 yaşından küçük ,bilgi işlem veya muhasebe<br />

bölümünde çalışan,erkek, 2000 liradan fazla<br />

maaş alan, Ankara doğumlu, Sarıyer’de<br />

oturan,10 yıldan fazla şirkette çalışan, bekar, 10<br />

liradan fazla kesinti yapılan personeli listelemek<br />

istersek;<br />

SELECT ad,soyad<br />

FROM personel,meslekler,ucretler<br />

WHERE dogum_tarihi > ‘01.01.1959’<br />

AND personel.meslek_id=meslekler.meslek_id<br />

AND (meslek_aciklama=’Bilgi İşlem’ OR<br />

meslek_aciklama=’Muhasebe’)<br />

AND cinsiyet=1<br />

AND sicil_no=per_sicil_no AND aylik_ucret<br />

> 200000000<br />

AND dogum_yeri=’Ankara’<br />

AND adres LIKE ‘%Sarıyer%’<br />

AND baslama_tarihi > ‘01.01.1989’<br />

AND medeni_hal=0<br />

AND kesinti>10000000<br />

Örnek 10 :<br />

Adı E ile başlayan, 3,5 ve 7 nolu meslek grubuna<br />

ait, bayan, bekâr, 30 yaşından küçük, 100<br />

milyondan fazla maaş alan personel listesi ;<br />

SELECT ad,soyad<br />

FROM personel,ucretler<br />

WHERE ad LIKE ‘E%’<br />

AND meslek_id IN (3,5,7)<br />

AND cinsiyet=0<br />

AND medeni_hal=0<br />

AND dogum_tarihi > ‘01.01.1969’<br />

AND sicil_no=per_sicil_no<br />

AND aylik_ücret > 100000000<br />

Örnek 11 :<br />

Evli ve aile yardımı almayan persenol listesi;<br />

SELECT ad,soyad<br />

FROM personel,ucretler<br />

WHERE medeni_hal=1 AND aile_yardim=0<br />

Örnek 8 :<br />

Muhasebe ve Pazarlama bölümü dışında çalışan<br />

perseneli listelemek istersek;<br />

SELECT ad,soyad<br />

FROM personel,meslekler<br />

WHERE personel.meslek_id=meslekler.<br />

meslek_id<br />

AND meslek_aciklama’Pazarlama’ AND<br />

meslek_aciklama’Muhasebe’<br />

Örnek 9 :<br />

40 yaşları arasında İzmir ve Bursa doğumlu<br />

adayları listelemek istersek;<br />

Fatih Soysal<br />

15<br />

SELECT ad,soyad<br />

FROM personel<br />

WHERE dogum_tarihi BETWEEN ‘01.01.1959’<br />

AND ‘01.01.1969’<br />

AND (dogum_yeri=’İzmir’ OR dogum_<br />

yeri=’Bursa’)<br />

http://www.fatihsoysal.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!