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