Çerezler
Bu web sitesi sizlere daha iyi hizmet verebilmek için çerezleri kullanır.
                PHP, programlama dillerinin temel yapı taşlarından biri olan operatörler aracılığıyla değişkenler ve değerler üzerinde çeşitli işlemler yapmayı sağlar. Operatörler, matematiksel hesaplamalardan mantıksal karşılaştırmalara, değer atamalarından veri manipülasyonlarına kadar geniş bir yelpazede görev alarak kodun işlevselliğini ve dinamizmini artırır. Bu kılavuz, PHP dilindeki farklı operatör türlerini, bunların sözdizimini ve pratik kullanım örneklerini adım adım açıklamaktadır.
PHP'deki operatörlerin sözdizimi, operatörün türüne ve aldığı işlenen (operand) sayısına göre değişiklik gösterir. Genellikle bir operatör, bir veya daha fazla değer (işlenen) üzerinde belirli bir işlemi gerçekleştirir ve bir sonuç üretir. Genel yapı aşağıdaki gibidir:
Tekli (Unary) Operatörler: Tek bir işlenen üzerinde işlem yaparlar. Örnek: `$a++` (arttırma), `!$b` (mantıksal değil).
İkili (Binary) Operatörler: İki işlenen üzerinde işlem yaparlar. Örnek: `$a + $b` (toplama), `$x == $y` (eşitlik karşılaştırması).
Üçlü (Ternary) Operatörler: Üç işlenen üzerinde işlem yaparlar. PHP'de koşullu operatör (ternary operator) bu kategoriye girer. Örnek: `$koşul ? $değer1 : $değer2`.
Operatörler, işlenenlerin arasına veya bir işlenenin önüne/arkasına yerleştirilerek kullanılır.
PHP, çeşitli işlem türleri için farklı operatör kategorileri sunar:
Matematiksel işlemler için kullanılırlar.
+ (Toplama): İki sayıyı toplar. Örnek: `$a + $b`.
- (Çıkarma): Bir sayıdan diğerini çıkarır. Örnek: `$a - $b`.
* (Çarpma): İki sayıyı çarpar. Örnek: `$a * $b`.
/ (Bölme): Bir sayıyı diğerine böler. Örnek: `$a / $b`.
% (Modülüs): Bölme işleminden kalanı verir. Örnek: `$a % $b`.
** (Üs Alma): Bir sayının kuvvetini hesaplar. Örnek: `$a ** $b` ($a üzeri $b).
Sağdaki işlenenin değerini soldaki işlenene atamak için kullanılırlar.
= (Atama): Sağdaki değeri soldaki değişkene atar. Örnek: `$a = 10;`.
+= (Topla ve Ata): `$a = $a + $b;` ile aynıdır. Örnek: `$a += $b;`.
-= (Çıkar ve Ata): `$a = $a - $b;` ile aynıdır. Örnek: `$a -= $b;`.
*= (Çarp ve Ata): `$a = $a * $b;` ile aynıdır. Örnek: `$a *= $b;`.
/= (Böl ve Ata): `$a = $a / $b;` ile aynıdır. Örnek: `$a /= $b;`.
%= (Modülüs ve Ata): `$a = $a % $b;` ile aynıdır. Örnek: `$a %= $b;`.
**= (Üs Al ve Ata): `$a = $a ** $b;` ile aynıdır. Örnek: `$a **= $b;`.
.= (Birleştir ve Ata - Stringler için): `$a = $a . $b;` ile aynıdır. Örnek: `$a .= $b;`.
İki değeri karşılaştırır ve true veya false döndürürler.
== (Eşitlik): İki değerin eşit olup olmadığını kontrol eder (veri türüne bakılmaksızın). Örnek: `$a == $b`.
=== (Özdeşlik): İki değerin eşit ve aynı veri türünde olup olmadığını kontrol eder. Örnek: `$a === $b`.
!= veya <> (Eşit Değil): İki değerin eşit olup olmadığını kontrol eder. Örnek: `$a != $b`.
!== (Özdeş Değil): İki değerin eşit veya aynı veri türünde olmadığını kontrol eder. Örnek: `$a !== $b`.
< (Küçüktür): Soldaki değerin sağdaki değerden küçük olup olmadığını kontrol eder. Örnek: `$a < $b`.
> (Büyüktür): Soldaki değerin sağdaki değerden büyük olup olmadığını kontrol eder. Örnek: `$a > $b`.
<= (Küçük Eşit): Soldaki değerin sağdaki değerden küçük veya eşit olup olmadığını kontrol eder. Örnek: `$a <= $b`.
>= (Büyük Eşit): Soldaki değerin sağdaki değerden büyük veya eşit olup olmadığını kontrol eder. Örnek: `$a >= $b`.
<=> (Spaceship Operatörü): PHP 7'den itibaren mevcuttur. İki ifadeyi karşılaştırır. Soldaki değer küçükse -1, eşitse 0, büyükse 1 döndürür. Örnek: `$a <=> $b`.
Koşulları birleştirmek veya tersine çevirmek için kullanılırlar.
&& veya and (VE): Her iki koşul da doğruysa true döndürür. Örnek: `$a > 0 && $b < 10`.
|| veya or (VEYA): Koşullardan en az biri doğruysa true döndürür. Örnek: `$a == 5 || $b == 7`.
! (DEĞİL): Koşulun tersini döndürür. Örnek: `!$koşul`.
xor (Özel VEYA): Koşullardan sadece biri doğruysa true döndürür. Her ikisi de doğru veya her ikisi de yanlış ise false döndürür.
Sayısal değişkenlerin değerini bir artırmak veya bir azaltmak için kullanılırlar.
++$a (Ön Arttırma): Değeri bir artırır, sonra değişkenin yeni değerini döndürür.
$a++ (Son Arttırma): Değişkenin orijinal değerini döndürür, sonra değeri bir artırır.
--$a (Ön Azaltma): Değeri bir azaltır, sonra değişkenin yeni değerini döndürür.
$a-- (Son Azaltma): Değişkenin orijinal değerini döndürür, sonra değeri bir azaltır.
Stringleri birleştirmek için kullanılırlar.
. (Birleştirme): İki stringi birleştirir. Örnek: `"Merhaba" . " Dünya"`.
.= (Birleştir ve Ata): Bir stringi diğerine ekler ve sonucu değişkene atar. Örnek: `$metin .= " yeni parça";`.
Dizileri karşılaştırmak veya birleştirmek için kullanılırlar.
+ (Birleşim): Sağdaki diziyi soldaki diziye ekler. Aynı anahtarlar varsa soldaki dizinin değeri korunur. Örnek: `$dizi1 + $dizi2`.
== (Eşitlik): Anahtar/değer çiftleri aynıysa true döndürür.
=== (Özdeşlik): Anahtar/değer çiftleri aynıysa ve aynı sırada ve aynı veri türündeyse true döndürür.
Basit bir if-else yapısını tek bir satırda ifade etmenin kısa yoludur.
(koşul) ? (doğru ise) : (yanlış ise): Koşul doğruysa ilk ifadeyi, yanlışsa ikinci ifadeyi döndürür. Örnek: `$durum = ($yas >= 18) ? "Yetişkin" : "Çocuk";`.
PHP 7'den itibaren mevcuttur. Bir değişkenin tanımlı ve null olmayan bir değere sahip olup olmadığını kontrol etmek için kullanılır.
??: Sol taraftaki işlenen varsa ve NULL değilse onu döndürür; aksi takdirde sağ taraftaki işleneni döndürür. Örnek: `$kullaniciAdi = $_GET['kullanici'] ?? 'Misafir';`.
Aşağıdaki örnekler, farklı operatör türlerinin PHP içindeki pratik uygulamalarını göstermektedir.
Aritmetik ve Atama Operatörleri Örneği";
echo "Başlangıç Değerleri: \$sayi1 = " . $sayi1 . ", \$sayi2 = " . $sayi2 . "
";
$toplam = $sayi1 + $sayi2; // Toplama
echo "Toplama (\$sayi1 + \$sayi2): " . $toplam . "
";
$fark = $sayi1 - $sayi2; // Çıkarma
echo "Çıkarma (\$sayi1 - \$sayi2): " . $fark . "
";
$carpim = $sayi1 * $sayi2; // Çarpma
echo "Çarpma (\$sayi1 * \$sayi2): " . $carpim . "
";
$bolum = $sayi1 / $sayi2; // Bölme
echo "Bölme (\$sayi1 / \$sayi2): " . $bolum . "
";
$mod = $sayi1 % $sayi2; // Modülüs
echo "Modülüs (\$sayi1 % \$sayi2): " . $mod . "
";
$kuvvet = $sayi1 ** 2; // Üs alma (20^2)
echo "Üs Alma (\$sayi1 ** 2): " . $kuvvet . "
";
$sayi1 += 10; // \$sayi1 = \$sayi1 + 10;
echo "Topla ve Ata (\$sayi1 += 10): " . $sayi1 . "
";
echo "
";
// Örnek 2: Karşılaştırma ve Mantıksal Operatörler
$yas = 25;
$ehliyetVar = true;
echo "Karşılaştırma ve Mantıksal Operatörler Örneği
";
echo "Değerler: \$yas = " . $yas . ", \$ehliyetVar = " . ($ehliyetVar ? "true" : "false") . "
";
if ($yas >= 18 && $ehliyetVar) { // Mantıksal VE
    echo "Ehliyet alabilir ve araba kullanabilir.
";
} else {
    echo "Ehliyet alamaz veya araba kullanamaz.
";
}
$puan = 85;
if ($puan > 90 || $puan == 85) { // Mantıksal VEYA
    echo "Tebrikler, yüksek puan aldınız!
";
} else {
    echo "Daha fazla çalışmanız gerekiyor.
";
}
$aktif = false;
if (!$aktif) { // Mantıksal DEĞİL
    echo "Kullanıcı pasif durumda.
";
}
echo "
";
// Örnek 3: Arttırma/Azaltma Operatörleri
$sayac = 10;
echo "Arttırma/Azaltma Operatörleri Örneği
";
echo "Başlangıç Değeri: \$sayac = " . $sayac . "
";
echo "Ön Arttırma (++\$sayac): " . (++$sayac) . ", \$sayac'ın yeni değeri: " . $sayac . "
"; // 11, 11
echo "Son Arttırma (\$sayac++): " . ($sayac++) . ", \$sayac'ın yeni değeri: " . $sayac . "
"; // 11, 12
echo "Ön Azaltma (--\$sayac): " . (--$sayac) . ", \$sayac'ın yeni değeri: " . $sayac . "
"; // 11, 11
echo "Son Azaltma (\$sayac--): " . ($sayac--) . ", \$sayac'ın yeni değeri: " . $sayac . "
"; // 11, 10
echo "
";
// Örnek 4: String ve Koşullu Operatörler
$ad = "Ahmet";
$soyad = "Yılmaz";
$tamAd = $ad . " " . $soyad; // String birleştirme
echo "String ve Koşullu Operatörler Örneği
";
echo "Tam Ad: " . $tamAd . "
";
$mesaj = "Hoşgeldin ";
$mesaj .= $ad; // String birleştir ve ata
echo "Mesaj: " . $mesaj . "
";
$kullaniciDurumu = ($yas >= 18) ? "Yetişkin" : "Çocuk"; // Koşullu operatör
echo "Kullanıcı Durumu: " . $kullaniciDurumu . "
";
echo "
";
// Örnek 5: Null Coalescing Operatörü
// $_GET['kullanici'] tanımlı değilse 'Misafir' kullan
$kullaniciAdi = $_GET['kullanici'] ?? 'Misafir';
echo "Null Coalescing Operatörü Örneği
";
echo "Kullanıcı Adı (varsayılan değer ile): " . $kullaniciAdi . "
";
// Diyelim ki $_GET['kullanici'] 'Can' olarak ayarlandı
$_GET['kullanici'] = 'Can';
$kullaniciAdi2 = $_GET['kullanici'] ?? 'Misafir';
echo "Kullanıcı Adı (belirlenmiş değer ile): " . $kullaniciAdi2 . "
";
?>Operatör Önceliği: Farklı operatörlerin farklı öncelik seviyeleri vardır. Matematikteki işlem sırası gibi, PHP de belirli operatörleri diğerlerinden önce yürütür (örn. çarpma ve bölme toplamadan önce). Karmaşık ifadelerde belirsizliği önlemek için parantez () kullanmak iyi bir uygulamadır.
Veri Tipi Juggling: PHP, zayıf tipli bir dil olduğu için karşılaştırma veya aritmetik işlemlerde farklı veri tiplerini otomatik olarak dönüştürmeye çalışabilir. Bu, bazen beklenmedik sonuçlara yol açabilir. Kesin tip karşılaştırması için === (özdeşlik) ve !== (özdeş değil) operatörlerini tercih edin.
Kısa Devre Değerlendirme (Short-Circuit Evaluation): Mantıksal operatörler (&&, ||) kısa devre değerlendirme yapar. Örneğin, $koşul1 && $koşul2 ifadesinde, $koşul1 yanlışsa, $koşul2 asla değerlendirilmez çünkü sonuç zaten false olacaktır. Bu durum, performans ve hata önleme açısından önemlidir.
Aynı Anda Hem Okuma Hem Yazma: Arttırma/azaltma operatörlerini (++, --) kullanırken, özellikle karmaşık ifadelerde veya bir değişkene aynı anda hem atama hem de işlem yaparken dikkatli olun. Ön ve son arttırma/azaltma arasındaki farkı anlamak önemlidir.
Bölme Sıfıra: Bir sayıyı sıfıra bölmek ($a / 0) bir uyarıya (Warning) neden olur ve sonuç olarak INF (sonsuz) veya NAN (sayı değil) döndürebilir. Uygulamalarınızda sıfıra bölme durumlarını kontrol etmeniz önerilir.
                Cascading Style Sheets (CSS), web sayfalarının görsel sunumunu kontrol eden bir stil sayfası dilidir. Bu sunumun temel bileşenlerinden biri de renklerdir. CSS, öğelere metin rengi, arka plan rengi, kenarlık rengi gibi çeşitli görsel özellikler atamak için kapsamlı bir dizi renk değeri ve yöntemi sunar. Bu kılavuz, CSS dilinde renklerin nasıl tanımlanacağını ve etkin bir şekilde nasıl kullanılacağını teknik ayrıntılarla açıklamaktadır.
    CSS'te bir öğenin rengini belirlemek için genel sözdizimi aşağıdaki gibidir. Burada , rengin uygulanacağı CSS özelliğini (örneğin, color, background-color, border-color) temsil ederken,  ise rengi tanımlayan spesifik değeri ifade eder.
selector {
    : ;
}
  
    , CSS'te bir rengi tanımlamak için kullanılabilecek çeşitli formatlara sahiptir. Bu formatlar, geliştiricilere esneklik ve hassasiyet sağlar. Başlıca renk tanımlama yöntemleri şunlardır:
            İsimlendirilmiş Renkler (Named Colors): CSS, belirli anahtar kelimelerle tanımlanmış standart renk isimleri sunar. Örneğin, red, blue, green, black, white gibi isimler doğrudan kullanılabilir. Toplamda 140'tan fazla standart renk adı bulunmaktadır.
        
            Hexadecimal Renkler (Hex Colors): Bu format, bir rengi altı haneli onaltılık bir değerle (#RRGGBB) tanımlar. İlk iki hane kırmızı (Red), sonraki iki hane yeşil (Green) ve son iki hane mavi (Blue) bileşenini temsil eder. Her bir bileşen 00 (en az yoğunluk) ile FF (en yüksek yoğunluk) arasında değer alır. Kısa gösterim olarak #RGB de kullanılabilir (örneğin, #FFF, #FFFFFF ile aynıdır).
        
            RGB Fonksiyonu (Red, Green, Blue): rgb(R, G, B) formatı, rengi kırmızı, yeşil ve mavi bileşenlerinin desimal değerleri (0-255 arası) ile tanımlar. Örneğin, rgb(255, 0, 0) kırmızı rengi temsil eder.
        
            RGBA Fonksiyonu (Red, Green, Blue, Alpha): rgba(R, G, B, A) formatı, RGB'ye ek olarak bir alfa (Alpha) kanalı ekler. Alfa değeri, rengin şeffaflık seviyesini (opaklığını) 0.0 (tamamen şeffaf) ile 1.0 (tamamen opak) arasında bir ondalık sayı ile belirler.
        
            HSL Fonksiyonu (Hue, Saturation, Lightness): hsl(H, S, L) formatı, rengi ton (Hue), doygunluk (Saturation) ve açıklık (Lightness) değerleriyle tanımlar.
        
Hue (Ton): Renk çarkındaki açıyı (0-360 derece) temsil eder. 0 veya 360 kırmızı, 120 yeşil, 240 mavidir.
Saturation (Doygunluk): Rengin canlılığını veya yoğunluğunu yüzde olarak (0% ile 100% arası) belirler. 0% gri ton, 100% ise tam renktir.
Lightness (Açıklık): Rengin açıklığını veya koyuluğunu yüzde olarak (0% ile 100% arası) belirler. 0% siyah, 100% beyaz, 50% normal renktir.
            HSLA Fonksiyonu (Hue, Saturation, Lightness, Alpha): hsla(H, S, L, A) formatı, HSL'ye ek olarak bir alfa (Alpha) kanalı ekler. Alfa değeri, rengin şeffaflığını 0.0 (tamamen şeffaf) ile 1.0 (tamamen opak) arasında bir ondalık sayı ile belirler.
        
Aşağıdaki örnekler, farklı renk tanımlama yöntemlerinin CSS kurallarında nasıl kullanıldığını göstermektedir.
/* İsimlendirilmiş Renk Kullanımı */
.header {
    background-color: navy;
    color: white;
}
/* Hexadecimal Renk Kullanımı */
.main-content {
    background-color: #F0F8FF; /* AliceBlue */
    border-color: #333; /* Koyu gri */
    color: #0A0A0A; /* Çok koyu gri */
}
/* RGB Fonksiyonu Kullanımı */
.success-message {
    background-color: rgb(212, 237, 218); /* Açık yeşil */
    color: rgb(60, 118, 61); /* Koyu yeşil */
}
/* RGBA Fonksiyonu Kullanımı (yarı şeffaf arka plan) */
.overlay {
    background-color: rgba(0, 0, 0, 0.7); /* %70 opak siyah */
    color: white;
}
/* HSL Fonksiyonu Kullanımı */
.accent-button {
    background-color: hsl(200, 70%, 50%); /* Orta mavi ton */
    color: hsl(0, 0%, 100%); /* Beyaz */
}
/* HSLA Fonksiyonu Kullanımı (yarı şeffaf kenarlık) */
.card {
    border: 2px solid hsla(240, 100%, 50%, 0.5); /* Yarı şeffaf mavi kenarlık */
    background-color: white;
    padding: 15px;
}
Bu örnekler, farklı renk değerlerinin farklı CSS özelliklerine nasıl atandığını ve belirli görsel efektlerin nasıl elde edilebileceğini göstermektedir.
CSS'te renklerle çalışırken dikkate alınması gereken bazı önemli noktalar şunlardır:
Erişilebilirlik (Accessibility): Metin ve arka plan renkleri arasında yeterli kontrast oranının sağlanması, görme engelli veya renk körü kullanıcılar için içeriğin okunabilirliğini artırır. Web Content Accessibility Guidelines (WCAG) bu konuda standartlar belirler.
Tarayıcı Desteği: Modern tarayıcılar tüm belirtilen renk formatlarını destekler. Ancak, eski tarayıcılar için uyumluluk endişesi varsa, yaygın formatlar (hex veya RGB) tercih edilebilir.
            Tutarlılık: Bir projede belirli bir renk paleti kullanıldığında, bu renklerin değişkenler (CSS Custom Properties) aracılığıyla tanımlanması, kodun daha yönetilebilir ve tutarlı olmasını sağlar. Örneğin: --primary-color: #007bff;.
        
            Şeffaflık Kullanımı: rgba() ve hsla() fonksiyonlarındaki alfa kanalı, katmanlı tasarımlarda veya arka plan resimleri üzerinde renk tonlamaları oluşturmak için oldukça faydalıdır.
        
            Gelecek Renk Modelleri: CSS'in yeni sürümleri, lch(), lab() gibi daha gelişmiş renk modellerini ve color-mix() gibi renk manipülasyon fonksiyonlarını tanıtmaktadır. Bu özellikler daha geniş bir renk gamı ve daha hassas kontrol imkanı sunar.
        
                SQL (Yapısal Sorgu Dili), veritabanlarından veri almak ve manipüle etmek için kullanılan temel bir dildir. Veri kümelerini belirli bir düzene göre sıralamak, analiz ve raporlama süreçlerinde kritik öneme sahiptir. SQL'deki ORDER BY yan tümcesi, bir SELECT ifadesinden dönen sonuç kümesini bir veya daha fazla sütuna göre artan veya azalan sırada sıralamak için kullanılır. Bu kılavuz, ORDER BY ifadesinin sözdizimini, detaylı açıklamalarını ve pratik kullanım örneklerini adım adım ele alacaktır.
Aşağıdaki yapı, ORDER BY ifadesinin genel kullanım şeklini göstermektedir:
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column1 [ASC|DESC] [, column2 [ASC|DESC], ...];ORDER BY ifadesinin her bir bileşeni, sorgu sonuçlarının nasıl sıralanacağını belirler:
SELECT column1, column2, ...: Sorgu tarafından döndürülecek sütunları belirtir.
FROM table_name: Verilerin çekileceği tabloyu belirtir.
WHERE condition: İsteğe bağlıdır. Sonuç kümesini filtrelemek için kullanılır.
ORDER BY: Sonuç kümesinin sıralanacağı sütunları veya ifadeleri belirtmek için kullanılan anahtar kelimedir.
column1, column2, ...: Sıralama işleminin uygulanacağı bir veya daha fazla sütunun adıdır. Birden fazla sütun belirtilirse, sıralama ilk sütuna göre yapılır, ardından aynı değerlere sahip satırlar için ikinci sütuna göre sıralama devam eder ve bu böylece devam eder.
[ASC|DESC]: Sıralama yönünü belirten isteğe bağlı bir anahtar kelimedir:
ASC: Artan sıralama (ascending) için kullanılır. Varsayılan sıralama yönüdür, belirtilmese bile uygulanır.
DESC: Azalan sıralama (descending) için kullanılır.
NULLS FIRST|NULLS LAST: (Bazı veritabanı sistemlerine özeldir, örneğin Oracle, PostgreSQL) NULL değerlerinin sıralamada nerede yer alacağını belirler:
NULLS FIRST: NULL değerlerini en başa yerleştirir.
NULLS LAST: NULL değerlerini en sona yerleştirir.
Çoğu veritabanı sisteminde, ASC ile NULL'lar sona, DESC ile başa gelir. Bu anahtar kelimeler, bu davranışı açıkça kontrol etme imkanı sunar.
Aşağıdaki örnekler, bir Personel tablosu üzerinden ORDER BY ifadesinin farklı kullanım senaryolarını göstermektedir:
Örnek 1: Tek Bir Sütuna Göre Artan Sıralama
Bu örnek, Personel tablosundaki tüm personeli Ad sütununa göre alfabetik olarak artan sırada (ASC) sıralar. ASC varsayılan olduğu için açıkça belirtilmesine gerek yoktur.
SELECT PersonelID, Ad, Soyad, Maas
FROM Personel
ORDER BY Ad ASC;Örnek 2: Tek Bir Sütuna Göre Azalan Sıralama
Bu örnek, personeli Maas sütununa göre en yüksek maaştan en düşüğe doğru azalan sırada (DESC) sıralar.
SELECT PersonelID, Ad, Soyad, Maas
FROM Personel
ORDER BY Maas DESC;Örnek 3: Birden Fazla Sütuna Göre Sıralama
Bu örnek, personeli önce Soyad'a göre artan sırada, ardından aynı soyada sahip olanları Ad'a göre artan sırada sıralar.
SELECT PersonelID, Ad, Soyad, Maas
FROM Personel
ORDER BY Soyad ASC, Ad ASC;Örnek 4: Farklı Yönlerde Birden Fazla Sütuna Göre Sıralama
Bu örnek, personeli önce Maas'a göre azalan sırada, ardından aynı maaşa sahip olanları Soyad'a göre artan sırada sıralar.
SELECT PersonelID, Ad, Soyad, Maas
FROM Personel
ORDER BY Maas DESC, Soyad ASC;Örnek 5: NULL Değerlerini Yönetme (PostgreSQL/Oracle Örneği)
Varsayalım ki Personel tablosunda DepartmanID sütunu NULL değerler içerebilir. Bu örnek, DepartmanID'si NULL olanları en başa getirirken diğerlerini DepartmanID'ye göre artan sırada sıralar.
SELECT PersonelID, Ad, Soyad, DepartmanID
FROM Personel
ORDER BY DepartmanID NULLS FIRST, Ad ASC;Örnek 6: İfadeye Göre Sıralama
Sıralama için bir sütun adı yerine bir ifade de kullanabilirsiniz. Bu örnek, Maas ve Prim sütunlarının toplamına göre azalan sırada sıralar.
SELECT PersonelID, Ad, Soyad, Maas, Prim, (Maas + Prim) AS ToplamKazanc
FROM Personel
ORDER BY (Maas + Prim) DESC;Sıralama Yönü Varsayılanı: ORDER BY ifadesinde sıralama yönü belirtilmezse, varsayılan olarak ASC (artan) kullanılır.
Performans: Büyük veri kümelerinde sıralama işlemi maliyetli olabilir. Sıkça sıralama yapılan sütunlara indeks eklemek, sorgu performansını önemli ölçüde artırabilir.
NULL Değerlerinin Konumu: Çoğu veritabanı sisteminde, NULL değerler ASC sıralamasında en sona, DESC sıralamasında ise en başa yerleştirilir. Ancak Oracle ve PostgreSQL gibi bazı sistemler, NULLS FIRST veya NULLS LAST anahtar kelimeleriyle bu davranışı açıkça kontrol etme imkanı sunar.
Sütun Numaralarıyla Sıralama: Bazı SQL standartları ve veritabanı sistemleri (örneğin MySQL), ORDER BY ifadesinde SELECT listesindeki sütunların sırasını belirten sayısal indeksleri kullanmaya izin verir (örneğin, ORDER BY 2 DESC ikinci sütuna göre sıralar). Ancak bu kullanım, sorgu okunabilirliğini azalttığı ve sütun sırası değiştiğinde hataya açık olduğu için genellikle önerilmez.
Yerleşim: ORDER BY yan tümcesi, bir SQL sorgusunda genellikle en sona yerleştirilir. Yalnızca LIMIT veya FETCH NEXT gibi yan tümceler ORDER BY'dan sonra gelebilir.
İfadelere Göre Sıralama: Yalnızca sütun adları değil, aritmetik işlemler, fonksiyon çağrıları veya diğer ifadeler de ORDER BY ifadesi içinde kullanılabilir. Bu, sonuç kümesini daha karmaşık kriterlere göre sıralama esnekliği sağlar.
                Python programlamanın temel yapı taşlarından biri olan sayılar (numbers), verileri niceliksel olarak ifade etmemizi sağlar. Bu veri tipleri, değişkenlerin değerlerini depolamak, matematiksel işlemler gerçekleştirmek ve algoritmik çözümler üretmek için vazgeçilmezdir. Python, tam sayılar, ondalıklı sayılar ve karmaşık sayılar olmak üzere üç ana sayı türünü destekler. Bu kılavuz, Python'da sayıların nasıl tanımlandığını, kullanıldığını ve yönetildiğini ayrıntılı olarak ele alacaktır.
Python'da bir sayı tanımlamak oldukça basittir. Değişkenlere doğrudan sayısal değerler atayarak bu işlemi gerçekleştirebilirsiniz. Python'ın dinamik tipleme yapısı sayesinde, bir sayının türünü açıkça belirtmenize gerek yoktur; yorumlayıcı atanan değere göre türü otomatik olarak belirler.
Aşağıdaki örnekler, farklı sayı türlerinin temel atama sözdizimini göstermektedir:
# Tam sayı (Integer) ataması
tam_sayi = 100
# Ondalıklı sayı (Float) ataması
ondalikli_sayi = 3.14
# Karmaşık sayı (Complex) ataması
karma_sayi = 2 + 3j
Python, üç temel sayı türü sunar:
Tam Sayılar (int): Pozitif veya negatif, tam sayı değerlerini temsil ederler. Python 3'te tam sayıların boyutu yalnızca sistemin belleğiyle sınırlıdır, yani istediğiniz kadar büyük tam sayılarla çalışabilirsiniz. Örnekler: 5, -100, 12345678901234567890. Tam sayılar ayrıca ikili (0b), sekizli (0o) ve onaltılı (0x) tabanlarda da temsil edilebilir.
Ondalıklı Sayılar (float): Ondalık noktası içeren veya bilimsel gösterimle ifade edilen gerçek sayıları temsil ederler. Çift duyarlıklı (double-precision) kayan noktalı sayılar olarak uygulanırlar ve genellikle 64-bit IEEE 754 standardına uygundurlar. Örnekler: 3.14, -0.001, 2.5e-3 (yani 2.5 * 10^-3).
Karmaşık Sayılar (complex): Gerçel ve sanal kısımları olan sayıları temsil ederler. Sanal kısım, bir sayının sonuna j veya J eklenerek belirtilir. Örnekler: 1 + 2j, -5j, 3.14 + 2.71j. Gerçel kısma .real, sanal kısma ise .imag nitelikleri ile erişilebilir.
Her bir sayı türü, belirli matematiksel ve mantıksal işlemler için optimize edilmiştir. Örneğin, tam sayılar genellikle kesin sayımlar için kullanılırken, ondalıklı sayılar ölçümler ve bilimsel hesaplamalar için tercih edilir.
Aşağıdaki örnekler, Python'da farklı sayı türlerinin tanımlanmasını, türlerinin kontrol edilmesini ve temel aritmetik işlemlerin yapılmasını göstermektedir.
Örnek 1: Temel Sayı Atamaları ve Tür Kontrolü
# Tam sayı ataması
sayi1 = 42
print(f"sayi1 değeri: {sayi1}, Türü: {type(sayi1)}")
print("
") # Çıktıda boş satır için
# Ondalıklı sayı ataması
sayi2 = 3.14159
print(f"sayi2 değeri: {sayi2}, Türü: {type(sayi2)}")
print("
") # Çıktıda boş satır için
# Karmaşık sayı ataması
sayi3 = -1 + 2.5j
print(f"sayi3 değeri: {sayi3}, Türü: {type(sayi3)}")
print(f"sayi3'ün gerçek kısmı: {sayi3.real}")
print(f"sayi3'ün sanal kısmı: {sayi3.imag}")
Örnek 2: Aritmetik İşlemler
a = 15
b = 4
# Toplama
toplam = a + b
print(f"{a} + {b} = {toplam}")
print("
")
# Çıkarma
fark = a - b
print(f"{a} - {b} = {fark}")
print("
")
# Çarpma
carpim = a * b
print(f"{a} * {b} = {carpim}")
print("
")
# Bölme (Sonuç her zaman float döner)
bolum = a / b
print(f"{a} / {b} = {bolum}")
print("
")
# Tam Bölme (Sonuç tam sayı döner, ondalık kısım atılır)
tam_bolum = a // b
print(f"{a} // {b} = {tam_bolum}")
print("
")
# Modulo (Kalanı verir)
kalan = a % b
print(f"{a} % {b} = {kalan}")
print("
")
# Üs alma
us_alma = a ** b
print(f"{a} ** {b} = {us_alma}")
Örnek 3: Tür Dönüşümleri (Type Casting)
x = 7.89
y = 10
z = "25"
# Float'tan int'e dönüşüm (ondalık kısım atılır)
int_x = int(x)
print(f"{x} (float) -> {int_x} (int), Türü: {type(int_x)}")
print("
")
# Int'ten float'a dönüşüm
float_y = float(y)
print(f"{y} (int) -> {float_y} (float), Türü: {type(float_y)}")
print("
")
# String'ten int'e dönüşüm
int_z = int(z)
print(f"'{z}' (str) -> {int_z} (int), Türü: {type(int_z)}")
print("
")
# String'ten float'a dönüşüm
float_z = float(z)
print(f"'{z}' (str) -> {float_z} (float), Türü: {type(float_z)}")
Ondalıklı Sayı Hassasiyeti: Ondalıklı sayılar (float), ikili (binary) tabanda tam olarak temsil edilemeyebilir. Bu durum, beklenenden farklı sonuçlara yol açabilen hassasiyet sorunlarına neden olabilir. Finansal veya yüksek hassasiyet gerektiren hesaplamalar için decimal modülünü kullanmak daha doğru bir yaklaşım olabilir.
Tam Sayı Boyutu: Python'da tam sayıların boyutu sınırsızdır. Bu, diğer bazı programlama dillerinde olduğu gibi taşma (overflow) sorunları yaşanmadığı anlamına gelir.
Tür Dönüşümleri: Bir sayı türünü başka bir türe dönüştürürken (örneğin, float'tan int'e), veri kaybı yaşanabileceğini unutmayın. Örneğin, int(3.9) sonucu 3 olacaktır.
Bölme Operatörleri: Tek eğik çizgi (/) operatörü her zaman bir float sonuç döndürürken, çift eğik çizgi (//) operatörü tam bölme yapar ve sonuç int (her iki işlenen de int ise) veya float (işlenenlerden biri float ise) olarak döner.
Karmaşık Sayı Kullanımı: Karmaşık sayılar daha çok bilimsel ve mühendislik uygulamalarında kullanılır. Normal iş uygulamalarında nadiren karşılaşılırlar.
Operatör Önceliği: Matematiksel işlemlerde standart operatör önceliği (parantez, üs, çarpma/bölme, toplama/çıkarma) geçerlidir. İşlem sırasını açıkça belirtmek için parantezler kullanın.
                PHP, sunucu taraflı betik dili olarak, program akışını yönetmek için çeşitli denetim yapıları sunar. Bu yapılar, belirli koşullara bağlı olarak kod bloklarının yürütülmesini veya belirli işlemlerin tekrar tekrar gerçekleştirilmesini sağlar. Denetim yapıları, herhangi bir programlama dilinin temelini oluşturur ve uygulamanızın mantıksal akışını şekillendirmenize olanak tanır. Bu makale, PHP'deki temel denetim yapılarının nasıl kullanılacağını, sözdiziminden pratik örneklere kadar adım adım açıklayacaktır.
PHP'de yaygın olarak kullanılan denetim yapılarının temel sözdizimi aşağıda listelenmiştir:
// If-Else If-Else Yapısı
if (koşul_1) {
    // koşul_1 doğru ise çalışacak kod bloğu
} elseif (koşul_2) {
    // koşul_1 yanlış ve koşul_2 doğru ise çalışacak kod bloğu
} else {
    // tüm koşullar yanlış ise çalışacak kod bloğu
}
// Switch Yapısı
switch (ifade) {
    case değer_1:
        // ifade, değer_1'e eşit ise çalışacak kod bloğu
        break;
    case değer_2:
        // ifade, değer_2'ye eşit ise çalışacak kod bloğu
        break;
    default:
        // hiçbir case ile eşleşmezse çalışacak kod bloğu
        break;
}
// While Döngüsü
while (koşul) {
    // koşul doğru olduğu sürece çalışacak kod bloğu
}
// Do-While Döngüsü
do {
    // kod bloğu en az bir kez çalışır, sonra koşul kontrol edilir
} while (koşul);
// For Döngüsü
for (başlangıç; koşul; artırma/azaltma) {
    // koşul doğru olduğu sürece ve her döngüde artırma/azaltma ile çalışacak kod bloğu
}
// Foreach Döngüsü
foreach ($dizi as $değer) {
    // her dizi elemanı için çalışacak kod bloğu
}
// Foreach Döngüsü (Anahtar ve Değer ile)
foreach ($dizi as $anahtar => $değer) {
    // her dizi elemanı için anahtar ve değer ile çalışacak kod bloğu
}
// Döngü Kontrol Anahtar Kelimeleri
// break: mevcut döngüyü tamamen sonlandırır
// continue: mevcut iterasyonu atlar ve bir sonraki iterasyona geçer
Her bir denetim yapısı, belirli bir amaca hizmet eder ve programınızın mantıksal akışını farklı şekillerde yönetir:
if, else if, else: Bu yapılar, belirli bir koşulun doğruluğuna göre farklı kod bloklarını çalıştırmak için kullanılır. if ifadesi, ana koşulu kontrol eder. Eğer bu koşul yanlışsa, isteğe bağlı olarak bir veya daha fazla else if ifadesi ek koşulları kontrol eder. Hiçbir koşul doğru olmazsa, isteğe bağlı else bloğu yürütülür.
switch: Tek bir ifadenin farklı olası değerlerine göre farklı kod bloklarını yürütmek için kullanılır. Her bir case bloğu, ifadenin belirli bir değerle eşleşip eşleşmediğini kontrol eder. break anahtar kelimesi, eşleşen bir case bulunduğunda switch bloğundan çıkılmasını sağlar. default bloğu, hiçbir case ile eşleşme olmadığında çalışır.
while: Belirtilen bir koşul doğru olduğu sürece bir kod bloğunu tekrarlamak için kullanılır. Koşul, döngü bloğu yürütülmeden önce kontrol edilir. Eğer koşul başlangıçta yanlışsa, döngü bloğu hiç çalışmayabilir.
do-while: while döngüsüne benzer, ancak kod bloğu en az bir kez yürütülür, ardından koşul kontrol edilir. Bu, kod bloğunun her zaman en az bir kez çalışmasını garanti eder.
for: Belirli sayıda tekrar yapılması gereken durumlarda kullanılır. Üç bölümden oluşur: başlangıç ifadesi (döngü başlamadan önce bir kez çalışır), koşul ifadesi (her iterasyon öncesi kontrol edilir) ve artırma/azaltma ifadesi (her iterasyon sonrası çalışır).
foreach: Özellikle diziler ve nesneler üzerinde kolayca yineleme yapmak için tasarlanmıştır. Dizinin her elemanı için bir kez döngü yapar, elemanın değerini (ve isteğe bağlı olarak anahtarını) bir değişkene atar.
break: İçinde bulunduğu döngüyü (for, while, do-while, foreach) veya switch ifadesini anında sonlandırır ve kontrolü döngüden veya switch bloğundan sonraki ifadeye aktarır.
continue: İçinde bulunduğu döngünün mevcut iterasyonunu atlar ve döngünün bir sonraki iterasyonuna geçer. Koşul kontrolü veya artırma/azaltma işlemi normal şekilde devam eder.
Aşağıdaki örnekler, PHP denetim yapılarının gerçek senaryolarda nasıl kullanılabileceğini göstermektedir:
Örnek 1: Notlandırma Sistemi (if-else if-else)
= 90) {
    echo "Harf Notu: AA
";
} elseif ($not >= 80) {
    echo "Harf Notu: BA
";
} elseif ($not >= 70) {
    echo "Harf Notu: BB
";
} elseif ($not >= 60) {
    echo "Harf Notu: CB
";
} else {
    echo "Harf Notu: FF
";
}
?>
Örnek 2: Haftanın Günü Kontrolü (switch)
";
        break;
    case "Cumartesi":
    case "Pazar":
        echo "Bugün hafta sonu.
";
        break;
    default:
        echo "Geçersiz gün adı.
";
        break;
}
?>
Örnek 3: Sayı Sayma (for Döngüsü)
";
for ($i = 1; $i <= 5; $i++) {
    echo $i . "
";
}
?>
Örnek 4: Koşul Doğru Olduğu Sürece Çalışma (while Döngüsü)
";
$sayac = 0;
while ($sayac < 4) {
    echo $sayac . "
";
    $sayac++;
}
?>
Örnek 5: Dizi Elemanlarını Listeleme (foreach Döngüsü)
";
foreach ($meyveler as $meyve) {
    echo "- " . $meyve . "
";
}
$kullanici = [
    "ad" => "Ahmet",
    "soyad" => "Yılmaz",
    "yas" => 30
];
echo "
Kullanıcı Bilgileri: 
";
foreach ($kullanici as $anahtar => $deger) {
    echo $anahtar . ": " . $deger . "
";
}
?>
Örnek 6: Döngü Kontrol Anahtar Kelimeleri (break ve continue)
";
for ($i = 1; $i <= 10; $i++) {
    if ($i == 3) {
        // 3'ü atla
        continue;
    }
    if ($i == 8) {
        // 8'e gelince döngüyü sonlandır
        break;
    }
    echo $i . "
";
}
// Çıktı: 1, 2, 4, 5, 6, 7
?>
break Kullanımı: switch yapısında her case bloğunun sonunda break kullanmak önemlidir. Aksi takdirde, eşleşen case'den sonraki case'ler de koşulsuz olarak çalışmaya devam eder (fall-through davranışı).
Sonsuz Döngülerden Kaçınma: while ve for döngülerinde, koşulun bir noktada yanlış olmasını sağlayacak bir mekanizma (örneğin, bir sayacın artırılması/azaltılması) bulunduğundan emin olun. Aksi takdirde, programınız sonsuz bir döngüye girer ve kaynakları tüketir.
Üçlü Operatör (Ternary Operator): Basit if-else ifadeleri için PHP'nin üçlü operatörü (koşul ? doğru_ise_değer : yanlış_ise_değer) kullanılabilir. Bu, kodu daha kısa ve okunabilir hale getirebilir.
Doğru Yapıyı Seçmek: Hangi denetim yapısının kullanılacağına karar verirken, ihtiyacınız olan işlevselliği göz önünde bulundurun. Örneğin, belirli sayıda tekrar için for, koşul doğru olduğu sürece tekrar için while, dizi veya nesne yinelemesi için foreach daha uygundur.
Kod Girintileme: Denetim yapılarının içindeki kod bloklarını düzenli bir şekilde girintilemek, kodunuzun okunabilirliğini ve anlaşılırlığını önemli ölçüde artırır.
                CSS (Basamaklı Stil Sayfaları), web sayfalarının görsel sunumunu kontrol eden temel bir dildir. Bir HTML öğesinin arka planını tanımlamak, genel kullanıcı deneyimini ve estetiği büyük ölçüde etkileyen kritik bir tasarım öğesidir. Bu kılavuz, CSS'in arka plan özelliklerinin kapsamlı kullanımını, sözdizimini, detaylı açıklamalarını ve pratik örneklerini adım adım sunarak, web geliştiricilerinin bu güçlü aracı etkili bir şekilde kullanmalarını sağlamayı amaçlamaktadır.
CSS arka plan özellikleri, bireysel olarak veya birleşik bir background kısaltma özelliği aracılığıyla tanımlanabilir. Kısaltma özelliği, birden fazla arka plan özelliğini tek bir bildirimde birleştirerek kodun daha okunabilir ve yönetilebilir olmasını sağlar.
.element {
    background:      /   ;
}
        background kısaltma özelliği, aşağıdaki alt özelliklerin bir kombinasyonunu alabilir:
background-color: Bir öğenin arka plan rengini ayarlar. Geçerli değerler arasında renk anahtar kelimeleri (red), onaltılık kodlar (#FF0000), RGB/RGBA (rgb(255,0,0)) veya HSL/HSLA (hsl(0, 100%, 50%)) bulunur.
background-image: Bir öğenin arka plan görselini ayarlar. Genellikle url() fonksiyonu ile bir görselin yolunu belirtir veya linear-gradient(), radial-gradient() gibi CSS gradyan fonksiyonlarını kullanır.
background-repeat: Arka plan görselinin nasıl tekrar edeceğini belirler. Yaygın değerler repeat (varsayılan), repeat-x, repeat-y, no-repeat, space ve round'dur.
background-position: Arka plan görselinin başlangıç konumunu ayarlar. Anahtar kelimeler (top, center, bottom, left, right), yüzdeler (50% 50%) veya uzunluk birimleri (10px 20px) ile belirtilebilir.
background-size: Arka plan görselinin boyutunu ayarlar. Anahtar kelimeler (auto, cover, contain), yüzdeler veya uzunluk birimleri ile belirtilir. background-position özelliğinden sonra bir eğik çizgi (/) ile ayrılır.
background-attachment: Arka plan görselinin belge kaydırıldığında nasıl davranacağını belirler. scroll (varsayılan, öğe ile birlikte kayar), fixed (pencereye sabit kalır) ve local (öğe içeriği ile birlikte kayar) değerlerini alır.
background-origin: Arka plan görselinin konumlandırma alanını belirler. padding-box (varsayılan), border-box ve content-box değerlerini alır. Genellikle background-position ve background-repeat ile etkileşime girer.
background-clip: Arka planın (rengi veya görseli) nerede kırpılacağını belirler. border-box (varsayılan), padding-box, content-box ve text değerlerini alır. text değeri, arka planı metnin içine kırparak ilgi çekici görsel efektler oluşturabilir.
Aşağıdaki örnekler, farklı arka plan özelliklerinin nasıl kullanılabileceğini göstermektedir.
Örnek 1: Basit Arka Plan Rengi ve Görseli
Bir öğeye düz bir arka plan rengi ve tekrarlamayan bir görsel atama.
.container-1 {
    background-color: #f0f0f0;
    background-image: url('images/pattern.png');
    background-repeat: no-repeat;
    background-position: center center;
    padding: 20px;
    border: 1px solid #ccc;
    height: 150px;
}
Örnek 2: Kısaltma Özelliği ve Görsel Boyutlandırma
background kısaltma özelliğini kullanarak bir görseli tüm alanı kaplayacak şekilde ayarlama.
.container-2 {
    background: url('images/hero.jpg') no-repeat center center / cover;
    height: 300px;
    color: white;
    text-align: center;
    display: flex;
    align-items: center;
    justify-content: center;
}
Örnek 3: Gradyan Arka Plan
CSS linear-gradient() fonksiyonunu kullanarak bir gradyan arka plan oluşturma.
.container-3 {
    background: linear-gradient(to right, #4CAF50, #8BC34A);
    height: 100px;
    padding: 15px;
    color: white;
    text-align: center;
}
Örnek 4: Çoklu Arka Planlar
Birden fazla arka plan görselini üst üste kullanma.
.container-4 {
    background: 
        url('images/overlay.png') no-repeat top left, /* En üstteki görsel */
        url('images/background-texture.jpg') repeat; /* Alttaki görsel */
    background-size: 50% auto, auto;
    height: 250px;
    padding: 20px;
    color: #333;
}
Örnek 5: Sabit Arka Plan (Paralaks Etkisi)
background-attachment: fixed; kullanarak kaydırmada sabit kalan bir arka plan oluşturma.
.container-5 {
    background-image: url('images/parallax.jpg');
    background-attachment: fixed;
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
    height: 400px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    font-size: 2em;
    text-shadow: 2px 2px 4px rgba(0,0,0,0.5);
}
Kısaltma Sırası: background kısaltma özelliği kullanılırken, özelliklerin sırası genellikle esnektir. Ancak, background-position ve background-size birlikte kullanıldığında, position önce gelir ve / ile size'dan ayrılır (örn: center / cover).
Çoklu Arka Planlar: Birden fazla background-image kullanırken, ilk belirtilen görsel en üstte, son belirtilen görsel ise en altta katmanlanır. Bu sıralamayı tasarıma göre ayarlamak önemlidir.
Performans: Büyük boyutlu veya çok sayıda arka plan görseli kullanmak sayfa yükleme sürelerini olumsuz etkileyebilir. Görselleri optimize etmek (sıkıştırma, doğru format kullanma) her zaman önerilir.
Erişilebilirlik: Arka plan görselleri veya renkleri üzerine metin yerleştirirken, yeterli kontrast olduğundan emin olun. Metnin okunabilirliğini sağlamak için color özelliği ile metin rengini doğru ayarlamak kritik öneme sahiptir.
background-clip: text: Bu özellik, arka planı yalnızca metnin kapladığı alana kırparak metnin içini bir görsel veya gradyanla doldurmanızı sağlar. Genellikle -webkit-background-clip: text; ve -webkit-text-fill-color: transparent; ile birlikte kullanılır.
                JavaScript, web geliştirmenin temelini oluşturan dinamik bir programlama dilidir. Bu dilin en temel ve sıkça kullanılan veri tiplerinden biri de sayılardır (Numbers). JavaScript'teki sayılar, hem tam sayıları (integer) hem de ondalıklı sayıları (floating-point) temsil edebilir ve esnek yapısıyla matematiksel işlemler için güçlü bir temel sunar.
JavaScript'te sayıları tanımlamak son derece basittir. Değişkenlere doğrudan sayısal değerler atayarak veya Number objesini kullanarak sayıları oluşturabilirsiniz.
const tamSayi = 42;
const ondalikliSayi = 3.14;
const negatifSayi = -5;
const bilimselSayi = 1.23e5; // 123000
const hexadecimalSayi = 0xFF; // 255
const octalSayi = 0o377; // 255 (modern JS'te 0o öneki ile)
const binarySayi = 0b11111111; // 255
const numberObjesi = new Number(100); // Nesne olarak sayı oluşturma (nadiren kullanılır)
Yukarıdaki örnekler, JavaScript'te sayıların nasıl farklı şekillerde tanımlanabileceğini göstermektedir. Çoğu durumda, doğrudan sayısal değer ataması tercih edilir.
JavaScript'teki sayılar, 64-bit çift duyarlıklı kayan nokta sayıları (double-precision floating-point numbers) olarak IEEE 754 standardına göre saklanır. Bu, hem tam sayıları hem de ondalıklı sayıları temsil edebildikleri anlamına gelir. Belirli sınırlar dahilinde, tam sayı değerleri de bu kayan nokta formatında hassasiyet kaybı olmadan saklanabilir.
Sayılar, decimal (onluk), hexadecimal (onaltılık, 0x öneki), octal (sekizlik, 0o öneki) ve binary (ikilik, 0b öneki) formatlarında ifade edilebilir. Ayrıca, çok büyük veya çok küçük sayıları bilimsel gösterim (örneğin, 1.23e-5) kullanarak da tanımlamak mümkündür.
JavaScript'in sayıları ayrıca bazı özel değerlere sahiptir: NaN (Not-a-Number), geçersiz veya tanımsız matematiksel işlemlerin sonucunu temsil eder. Infinity ve -Infinity ise sıfıra bölme veya sayısal limitlerin aşılması gibi durumlarda ortaya çıkan sonsuz pozitif ve negatif değerlerdir.
Sayı tanımlamaları ve aritmetik işlemler, JavaScript'te sıkça karşılaşılan senaryolardır.
// Örnek 1: Temel Sayı Tanımlamaları ve İşlemler
const sayi1 = 10;
const sayi2 = 5;
console.log(sayi1 + sayi2); // Çıktı: 15
console.log(sayi1 - sayi2); // Çıktı: 5
console.log(sayi1 * sayi2); // Çıktı: 50
console.log(sayi1 / sayi2); // Çıktı: 2
console.log(sayi1 % sayi2); // Çıktı: 0 (Modül operatörü)
Kayan noktalı sayılarla çalışırken hassasiyetin önemli olduğu durumlar olabilir.
// Örnek 2: Kayan Noktalı Sayılar ve Hassasiyet
const fiyat1 = 0.1;
const fiyat2 = 0.2;
console.log(fiyat1 + fiyat2); // Çıktı: 0.30000000000000004 (Kayan nokta hassasiyeti)
// Hassasiyet sorununu aşmak için bir yöntem (örneğin, tam sayılarla çalışıp sonra bölme)
console.log((fiyat1 * 10 + fiyat2 * 10) / 10); // Çıktı: 0.3
Özel sayı değerleri olan NaN ve Infinity, belirli durumlarda matematiksel işlemlerin sonucunu belirtmek için kullanılır.
// Örnek 3: Özel Sayı Değerleri (NaN, Infinity)
console.log(0 / 0); // Çıktı: NaN (Tanımsız işlem)
console.log(10 / 0); // Çıktı: Infinity (Pozitif sonsuz)
console.log(-10 / 0); // Çıktı: -Infinity (Negatif sonsuz)
console.log(isNaN(0 / 0)); // Çıktı: true (Bir değerin NaN olup olmadığını kontrol eder)
console.log(isFinite(10 / 0)); // Çıktı: false (Bir değerin sonlu olup olmadığını kontrol eder)
Farklı sayı tabanlarında değer tanımlama ve bilimsel gösterim, özel durumlar için kullanışlıdır.
// Örnek 4: Sayı Tabanları ve Bilimsel Gösterim
const hexValue = 0xA; // Onaltılık 10
const binValue = 0b1010; // İkilik 10
const sciValue = 2.5e3; // 2.5 * 10^3 = 2500
console.log(hexValue); // Çıktı: 10
console.log(binValue); // Çıktı: 10
console.log(sciValue); // Çıktı: 2500
JavaScript'teki tüm sayılar 64-bit kayan nokta (double-precision floating-point) formatında saklanır. Bu, tam sayılar için bile geçerlidir ve belirli büyük tam sayılarda hassasiyet kaybına yol açabilir (Number.MAX_SAFE_INTEGER ve Number.MIN_SAFE_INTEGER dışındaki değerler için).
Kayan nokta aritmetiği nedeniyle, bazı ondalıklı sayı işlemleri beklenen kesin sonucu vermeyebilir (örneğin, 0.1 + 0.2). Finansal hesaplamalar gibi hassasiyet gerektiren durumlarda bu durum göz önünde bulundurulmalıdır.
NaN (Not-a-Number), kendisiyle bile eşit değildir (NaN === NaN ifadesi false döner). Bir değerin NaN olup olmadığını kontrol etmek için Number.isNaN() veya global isNaN() fonksiyonlarını kullanın.
BigInt veri tipi, JavaScript'in standart Number tipinin ötesindeki çok büyük tam sayıları güvenli bir şekilde temsil etmek için kullanılır. Eğer Number.MAX_SAFE_INTEGER'dan büyük tam sayılarla çalışmanız gerekiyorsa BigInt düşünülmelidir.
Sayıları string'e dönüştürmek için String() fonksiyonu, .toString() metodu veya şablon değişmezleri (template literals) kullanılabilir. String'leri sayıya dönüştürmek için ise Number(), parseInt() veya parseFloat() fonksiyonları mevcuttur.
                SQL (Yapılandırılmış Sorgu Dili), veritabanlarından veri almak ve manipüle etmek için kullanılan standart dildir. Veri sorgularken, belirli kriterlere uyan kayıtları filtrelemek sıkça karşılaşılan bir gereksinimdir. Bu filtreleme işlemlerinde, birden fazla koşulu aynı anda değerlendirmek için mantıksal operatörler kullanılır. AND operatörü, bu mantıksal operatörlerden biridir ve WHERE cümleciği içinde iki veya daha fazla koşulun tümünün doğru olması durumunda kayıtları döndürmek için elzemdir. Bu makalede, SQL AND operatörünün detaylı kullanımını, sözdizimini ve pratik örneklerini inceleyeceğiz.
AND operatörünün temel sözdizimi, bir SELECT ifadesi içindeki WHERE cümleciğinde aşağıdaki gibi yapılandırılır:
SELECT kolon1, kolon2, ...
FROM tablo_adi
WHERE kosul1 AND kosul2 AND kosul3 ...;SELECT kolon1, kolon2, ...:
Bu kısım, sorgu sonucunda görmek istediğiniz sütunları belirtir. Tüm sütunları seçmek için * karakterini kullanabilirsiniz.
FROM tablo_adi:
Veri çekmek istediğiniz tabloyu belirtir.
WHERE kosul1 AND kosul2 AND kosul3 ...:
Bu kısım, AND operatörünün kalbidir. WHERE cümleciği, belirtilen koşulların doğru olduğu satırları filtreler. AND operatörü, kendisinden önce ve sonra gelen koşulların (kosul1, kosul2, kosul3 vb.) tümünün aynı anda doğru (TRUE) olması durumunda o satırı sonuç kümesine dahil eder. Eğer koşullardan herhangi biri yanlış (FALSE) ise, o satır sonuç kümesine dahil edilmez. Birden fazla AND operatörü kullanarak istediğiniz kadar koşulu birleştirebilirsiniz. Her kosul, karşılaştırma operatörleri (=, <, >, <=, >=, <> veya !=) veya diğer mantıksal operatörler (LIKE, IN, BETWEEN vb.) ile oluşturulabilir.
Aşağıdaki örnekler, bir Personel tablosu üzerinden AND operatörünün farklı senaryolarda nasıl kullanıldığını göstermektedir. Personel tablosunun PersonelID, Ad, Soyad, Departman, Maas ve DogumTarihi sütunlarına sahip olduğunu varsayalım.
Departmanı 'Satış' olan ve maaşı 5000'den yüksek olan tüm personelin adını ve soyadını listeleyelim.
SELECT Ad, Soyad
FROM Personel
WHERE Departman = 'Satış' AND Maas > 5000;Açıklama: Bu sorgu, Departman sütununun değeri 'Satış' olan VE Maas sütununun değeri 5000'den büyük olan satırları getirir. Her iki koşul da aynı anda sağlanmalıdır.
Departmanı 'Muhasebe' olan, maaşı 6000 ile 8000 arasında olan ve 1990 yılından sonra doğmuş personeli listeleyelim.
SELECT Ad, Soyad, Maas, DogumTarihi
FROM Personel
WHERE Departman = 'Muhasebe'
  AND Maas BETWEEN 6000 AND 8000
  AND DogumTarihi > '1990-01-01';Açıklama: Burada üç koşul AND ile birleştirilmiştir: Departman 'Muhasebe' olacak, Maas 6000 ile 8000 (dahil) arasında olacak VE DogumTarihi 1990'ın ilk gününden sonra olacak. Tüm bu koşullar doğru olduğunda satır sonuç kümesine dahil edilir.
Parantez kullanımı, mantıksal operatörlerin değerlendirme sırasını belirlemek için kritik öneme sahiptir. Departmanı 'İnsan Kaynakları' olan VE (maaşı 7000'den az VEYA 1985'ten önce doğmuş) personeli listeleyelim.
SELECT Ad, Soyad, Departman, Maas, DogumTarihi
FROM Personel
WHERE Departman = 'İnsan Kaynakları'
  AND (Maas < 7000 OR DogumTarihi < '1985-01-01');Açıklama: Bu sorguda, parantezler içindeki OR koşulu önce değerlendirilir. Yani, departman 'İnsan Kaynakları' olacak VE (maaş 7000'den az olacak VEYA doğum tarihi 1985'ten önce olacak) koşulu sağlanacak. Parantezler olmasaydı, AND operatörü OR operatöründen daha yüksek önceliğe sahip olduğu için sorgu farklı bir sonuç verebilirdi.
Mantıksal Öncelik: SQL'de mantıksal operatörlerin belirli bir öncelik sırası vardır. NOT en yüksek önceliğe sahipken, onu AND ve ardından OR takip eder. Bu, AND operatörlerinin OR operatörlerinden önce değerlendirileceği anlamına gelir. Karmaşık koşullarda beklenen sonucu almak için parantez () kullanmak her zaman iyi bir uygulamadır.
Performans: WHERE cümleciğindeki koşulların sırası, bazı veritabanı sistemlerinde sorgu performansını etkileyebilir. Genellikle, en kısıtlayıcı koşulu (en az sayıda satırı eleyecek koşulu) ilk sıraya koymak veya dizinli (indexlenmiş) sütunlar üzerindeki koşulları öne almak performansı artırabilir. Ancak modern veritabanı optimizatörleri bu tür durumları genellikle iyi yönetir.
Boş Değerler (NULL): NULL değerleri ile karşılaştırma yaparken dikkatli olun. NULL AND TRUE veya NULL AND FALSE ifadelerinin sonucu NULL olur. WHERE cümleciği yalnızca TRUE sonuçlarını döndürdüğü için, NULL sonuçlar elenir. NULL değerleri kontrol etmek için IS NULL veya IS NOT NULL operatörlerini kullanmalısınız.
Okunabilirlik: Birden fazla AND koşulu kullanırken, sorgunuzu satırlara ayırarak ve girinti kullanarak daha okunaklı hale getirin.
                Python programlama dilinde, geliştiricilerin kodlarının ilerleyişini izlemeleri, kullanıcıya bilgi sağlamaları veya hata ayıklama süreçlerini yönetmeleri için çıktılar üretmek temel bir gerekliliktir. Bu çıktılar genellikle standart çıktı akımına, yani konsola yönlendirilir. Python'ın yerleşik print() fonksiyonu, bu tür çıktı işlemlerini kolay ve etkili bir şekilde gerçekleştirmek için tasarlanmıştır. Bu makale, print() fonksiyonunun detaylı kullanımını, sözdizimini ve çeşitli senaryolardaki pratik uygulamalarını kapsamlı bir şekilde ele alacaktır.
Python'da print() fonksiyonunun genel sözdizimi aşağıdaki gibidir:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)Bu sözdizimi, fonksiyonun alabileceği tüm parametreleri ve varsayılan değerlerini göstermektedir. Her bir parametrenin özel bir amacı vardır ve çıktının nasıl biçimlendirileceğini veya nereye yönlendirileceğini kontrol etmek için kullanılabilir.
*objects: Fonksiyona virgülle ayrılmış olarak geçirilen sıfır veya daha fazla nesneyi temsil eder. Bu nesneler sayısal değerler, dizeler (string), listeler veya diğer Python veri yapıları olabilir. print() fonksiyonu, bu nesnelerin her birini string'e dönüştürür ve belirlenen sıra ile çıktı verir.
sep=' ' (separator): Çıktı verilecek nesneler arasına yerleştirilecek ayırıcı dizeyi belirtir. Varsayılan olarak, nesneler arasında tek bir boşluk karakteri kullanılır. Bu parametre, nesneler arasına farklı bir karakter veya karakter dizisi eklemek için değiştirilebilir.
end='\n' (end): Çıktı tamamlandıktan sonra eklenecek dizeyi belirtir. Varsayılan olarak, çıktının sonuna bir yeni satır karakteri (\n) eklenir, bu da sonraki print() çağrısının çıktısının yeni bir satırdan başlamasına neden olur. Bu parametre, çıktının aynı satırda devam etmesini sağlamak veya farklı bir son karakter eklemek için kullanılabilir.
file=sys.stdout: Çıktının yazılacağı dosya benzeri nesneyi belirtir. Varsayılan değer sys.stdout'dur, bu da çıktının standart konsola gönderildiği anlamına gelir. Bu parametreyi değiştirerek çıktıyı bir metin dosyasına veya başka bir akışa yönlendirmek mümkündür.
flush=False: Bu parametre, tamponlanmış çıktının anında temizlenip temizlenmeyeceğini kontrol eder. Varsayılan olarak False'tur, bu da çıktının dahili bir tamponda biriktirildiği ve belirli aralıklarla veya tampon dolduğunda yazıldığı anlamına gelir. True olarak ayarlandığında, çıktı anında tampondan boşaltılır ve hedef cihaza (örneğin konsola) yazılır. Bu, özellikle gerçek zamanlı izleme veya belirli durumlarda çıktıların hemen görünmesi gerektiğinde faydalıdır.
Aşağıdaki örnekler, print() fonksiyonunun farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
1. Temel Çıktı
print("Merhaba Dünya!")
print(123)
print(3.14)
print(True)Çıktı:
Merhaba Dünya!
123
3.14
True2. Birden Fazla Nesne ile Çıktı
ad = "Ayşe"
yas = 30
print("Ad:", ad, "Yaş:", yas)Çıktı:
Ad: Ayşe Yaş: 303. sep Parametresi Kullanımı
print("elma", "armut", "kiraz", sep="-")
print("www", "softmush", "com", sep=".")Çıktı:
elma-armut-kiraz
www.softmush.com4. end Parametresi Kullanımı
print("Bu birinci satır.", end=" ")
print("Bu ise aynı satırda devam ediyor.")
print("Bu da yeni bir satır.")Çıktı:
Bu birinci satır. Bu ise aynı satırda devam ediyor.
Bu da yeni bir satır.5. Dosyaya Çıktı Yazma (file Parametresi)
Bu örnek için önce bir dosya nesnesi oluşturulması gerekir.
import sys
# Dosyayı yazma modunda aç
with open("log.txt", "w") as f:
    print("Bu metin dosyaya yazılacak.", file=f)
    print("Bu da ikinci satır.", file=f)
# Konsola yazma (varsayılan)
print("Bu metin konsola yazılacak.")Çıktı (log.txt dosyasında):
Bu metin dosyaya yazılacak.
Bu da ikinci satır.Çıktı (Konsolda):
Bu metin konsola yazılacak.6. String Formatlama ile Çıktı
print() fonksiyonu genellikle f-string'ler (biçimlendirilmiş dize değişmezleri) veya str.format() metodu ile birlikte kullanılır, bu da çıktıların daha okunabilir ve düzenli olmasını sağlar.
isim = "Can"
yas = 25
# f-string kullanımı (Python 3.6+)
print(f"Merhaba, benim adım {isim} ve {yas} yaşındayım.")
# str.format() metodu kullanımı
print("Merhaba, benim adım {} ve {} yaşındayım.".format(isim, yas))
# Eski stil % formatlama
print("Merhaba, benim adım %s ve %d yaşındayım." % (isim, yas))Çıktı:
Merhaba, benim adım Can ve 25 yaşındayım.
Merhaba, benim adım Can ve 25 yaşındayım.
Merhaba, benim adım Can ve 25 yaşındayım.Fonksiyon Olarak Kullanım: Python 3 ve sonraki sürümlerinde print, bir fonksiyondur ve parantezlerle çağrılmalıdır (örneğin print("...")). Python 2'de ise bir ifadeydi (statement) ve parantez kullanmak zorunlu değildi (örneğin print "...").
Hata Ayıklamada Önemi: print() fonksiyonu, bir programın farklı noktalarındaki değişken değerlerini veya program akışını gözlemlemek için hızlı ve etkili bir hata ayıklama aracıdır.
Performans Etkileri: Özellikle büyük döngüler içinde veya yüksek performans gerektiren uygulamalarda aşırı print() kullanımı programın performansını olumsuz etkileyebilir, çünkü her çıktı işlemi I/O (Giriş/Çıkış) maliyeti taşır.
sys.stdout ve sys.stderr: Standart çıktı (sys.stdout) genellikle normal program mesajları için kullanılırken, hata mesajları ve uyarılar için standart hata akımı (sys.stderr) kullanılması iyi bir pratiktir. print() fonksiyonunu file=sys.stderr ile kullanarak hata mesajlarını ayrı bir akıma yönlendirebilirsiniz.
flush=True Kullanımı: Ağ iletişimi, interaktif uygulamalar veya uzun süreli işlemler gibi durumlarda, çıktının anında görünmesi kritik olabilir. Bu tür senaryolarda flush=True parametresi, tampondaki verilerin hemen gönderilmesini sağlar.
                JavaScript, web uygulamalarının etkileşimli ve dinamik olmasını sağlayan temel bir programlama dilidir. Bu dilin en güçlü ve esnek yapılarından biri de fonksiyonlardır. Fonksiyonlar, belirli bir görevi yerine getiren yeniden kullanılabilir kod bloklarıdır. Bu yapılar, kodunuzu daha modüler, okunabilir ve bakımı kolay hale getirir. Bu makale, JavaScript fonksiyonlarının temel kullanımını, sözdizimini ve pratik uygulamalarını detaylı bir şekilde ele almaktadır.
JavaScript'te bir fonksiyon tanımlamanın çeşitli yolları vardır. En yaygın olanı, function anahtar kelimesini kullanarak bir fonksiyon bildirimi (function declaration) yapmaktır:
function fonksiyonAdi(parametre1, parametre2) {
    // Fonksiyonun çalıştıracağı kod bloğu
    // return deger; (İsteğe bağlı: bir değer döndürür)
}Bu temel yapı, çoğu fonksiyonel ihtiyacınızı karşılayacaktır. Fonksiyonlar ayrıca bir değişkene atanan ifadeler (function expressions) veya modern JavaScript'in getirdiği ok fonksiyonları (arrow functions) olarak da tanımlanabilir.
Yukarıdaki sözdiziminde yer alan her bir bileşen, fonksiyonun çalışma şeklini belirler:
function: Bu anahtar kelime, bir fonksiyon tanımladığınızı belirtir.
fonksiyonAdi: Fonksiyonunuzu tanımlayan benzersiz bir isimdir. Bu isim aracılığıyla fonksiyona çağrı yaparsınız. Fonksiyon isimleri genellikle camelCase formatında yazılır (örn: hesaplaToplam).
(parametre1, parametre2, ...): Parantezler içinde, fonksiyona dışarıdan gönderilebilecek giriş değerlerini temsil eden virgülle ayrılmış parametreler bulunur. Bu parametreler isteğe bağlıdır; bir fonksiyon hiç parametre almayabilir. Fonksiyon çağrıldığında gönderilen değerlere argümanlar denir.
{ ... }: Küme parantezleri, fonksiyonun çalıştıracağı kod bloğunu içerir. Fonksiyon çağrıldığında bu blok içindeki tüm ifadeler sırayla yürütülür.
return deger;: return ifadesi, fonksiyonun çalışmasını durdurur ve belirtilen değeri fonksiyonun çağrıldığı yere geri döndürür. Eğer bir return ifadesi belirtilmezse veya boş bırakılırsa, fonksiyon varsayılan olarak undefined döndürür.
Fonksiyonların nasıl çalıştığını daha iyi anlamak için çeşitli kullanım senaryolarını inceleyelim:
Örnek 1: Parametresiz Basit Bir Fonksiyon
function selamVer() {
    console.log("Merhaba, JavaScript!");
}
// Fonksiyonu çağırma
selamVer(); // Konsola "Merhaba, JavaScript!" yazdırırBu örnekte, selamVer adında parametre almayan bir fonksiyon tanımlanmış ve çağrılmıştır. Fonksiyon çağrıldığında, içindeki console.log ifadesi çalışır.
Örnek 2: Parametre Alan ve Değer Döndüren Fonksiyon
function toplamaYap(sayi1, sayi2) {
    const toplam = sayi1 + sayi2;
    return toplam;
}
// Fonksiyonu argümanlarla çağırma ve değeri kullanma
let sonuc = toplamaYap(5, 3);
console.log("Toplam: " + sonuc); // Konsola "Toplam: 8" yazdırır
let baskaSonuc = toplamaYap(10, 20);
console.log("Başka Toplam: " + baskaSonuc); // Konsola "Başka Toplam: 30" yazdırırtoplamaYap fonksiyonu iki sayısal parametre alır, bu sayıları toplar ve sonucu return ifadesiyle geri döndürür. Döndürülen değer bir değişkene atanabilir veya doğrudan kullanılabilir.
Örnek 3: Fonksiyon İfadeleri (Function Expressions)
const carpmaYap = function(a, b) {
    return a * b;
};
// Fonksiyon ifadesini çağırma
let carpimSonucu = carpmaYap(4, 6);
console.log("Çarpım: " + carpimSonucu); // Konsola "Çarpım: 24" yazdırırBu örnekte, bir fonksiyon bir değişkene atanmıştır. Fonksiyon ifadeleri, özellikle bir fonksiyona başka bir argüman olarak geçirilmesi gereken durumlarda (callback fonksiyonları gibi) kullanışlıdır.
Örnek 4: Ok Fonksiyonları (Arrow Functions)
const kareAl = (sayi) => {
    return sayi * sayi;
};
// Tek parametreli ve tek satırlık fonksiyonlar için daha kısa yazım
const kareAlKisa = sayi => sayi * sayi;
// Ok fonksiyonlarını çağırma
console.log("5'in karesi: " + kareAl(5)); // Konsola "5'in karesi: 25" yazdırır
console.log("7'nin karesi (kısa): " + kareAlKisa(7)); // Konsola "7'nin karesi (kısa): 49" yazdırırES6 ile tanıtılan ok fonksiyonları, daha kısa ve daha okunaklı fonksiyon tanımlamaları sağlar. Özellikle tek ifadeli fonksiyonlar için return anahtar kelimesi ve küme parantezleri atlanabilir. Ok fonksiyonlarının this anahtar kelimesini ele alış biçimleri de geleneksel fonksiyonlardan farklıdır.
Fonksiyon Bildirimlerinin Hoisting'i: Fonksiyon bildirimleri (function fonksiyonAdi() { ... } şeklinde tanımlananlar) JavaScript'te hoisting özelliğine sahiptir. Bu, fonksiyonun kod içinde tanımlandığı yerden önce çağrılabileceği anlamına gelir. Ancak, fonksiyon ifadeleri ve ok fonksiyonları hoisting'e tabi değildir; yalnızca tanımlandıkları yerden sonra çağrılabilirler.
Parametre Sayısı ve Argümanlar: Bir fonksiyon tanımlarken belirtilen parametre sayısı ile çağrılırken gönderilen argüman sayısı eşleşmek zorunda değildir. Fazla argümanlar göz ardı edilirken, eksik argümanlar undefined değeri alır. Modern JavaScript'te varsayılan parametre değerleri tanımlayarak bu durumu yönetmek mümkündür.
return İfadesinin Önemi: return ifadesi, fonksiyonun bir değer üretmesini ve bu değeri dış dünyaya aktarmasını sağlar. Bir fonksiyonun içinde return ifadesine ulaşıldığında, fonksiyonun yürütülmesi anında durur ve kontrolü çağrı yapan koda geri verir.
Kapsam (Scope): Fonksiyonlar kendi içlerinde ayrı bir yerel kapsam (local scope) oluşturur. Bir fonksiyon içinde tanımlanan değişkenler (let veya const ile), yalnızca o fonksiyon içinde erişilebilir. Bu, değişken çakışmalarını önlemeye yardımcı olur ve kodun izolasyonunu artırır.
Yan Etkilerden Kaçının: Özellikle büyük uygulamalarda, fonksiyonların mümkün olduğunca saf (pure) olmasına özen gösterin. Saf fonksiyonlar, aynı argümanlarla her zaman aynı çıktıyı verir ve dış dünyayı (global değişkenler, DOM vb.) değiştirmez. Bu, kodun test edilebilirliğini ve öngörülebilirliğini artırır.
                Veritabanı sorgularında, belirli kriterlere uyan verileri çekmek genellikle tek bir koşuldan daha fazlasını gerektirir. SQL'deki mantıksal operatörler, bu tür karmaşık filtreleme ihtiyaçlarını karşılamak için güçlü araçlar sunar. Bu operatörlerden biri olan OR operatörü, birden fazla koşuldan en az birinin doğru olması durumunda bir kaydın sonuç kümesine dahil edilmesini sağlar. Bu makale, OR operatörünün sözdizimini, detaylı açıklamasını ve çeşitli pratik kullanım örneklerini ele alarak, veritabanı sorgularınızda çoklu koşulları etkin bir şekilde nasıl birleştireceğinizi göstermeyi amaçlamaktadır.
OR operatörü, genellikle WHERE yan tümcesi içinde, iki veya daha fazla koşulu birleştirmek için kullanılır. Genel sözdizimi aşağıdaki gibidir:
SELECT kolon1, kolon2, ...
FROM tablo_adı
WHERE koşul1 OR koşul2 OR koşul3 ...;Burada, koşul1, koşul2, koşul3 vb. birbirine OR operatörü ile bağlanan boolean ifadelerdir.
SELECT kolon1, kolon2, ...: Sorgu sonucunda görüntülenmesini istediğiniz sütunları belirtir.
FROM tablo_adı: Verilerin çekileceği veritabanı tablosunun adını belirtir.
WHERE: Sorgu sonucunu filtrelemek için kullanılan bir yan tümcedir. Sadece belirtilen koşul veya koşulları karşılayan satırlar sonuç kümesine dahil edilir.
koşul1, koşul2, koşul3: Bunlar, değerlendirilecek boolean ifadelerdir. Her koşul, bir sütun adı, bir operatör (=, >, <, >=, <=, <>, LIKE vb.) ve bir değerden oluşabilir.
OR: Bu mantıksal operatör, kendisiyle birleştirilen koşullardan herhangi birinin doğru (TRUE) olması durumunda tüm WHERE yan tümcesinin doğru kabul edilmesini sağlar. Eğer koşullardan biri bile doğruysa, ilgili satır sonuç kümesine dahil edilir. Sadece tüm koşullar yanlış (FALSE) olduğunda satır elenir.
OR ile FiltrelemeBelirli bir şehirdeki veya belirli bir departmandaki tüm çalışanları listelemek istediğinizde OR kullanabilirsiniz. Aşağıdaki örnek, 'İstanbul' şehrinde ikamet eden VEYA 'Pazarlama' departmanında çalışan tüm personeli getirir.
SELECT *
FROM Calisanlar
WHERE Sehir = 'İstanbul' OR Departman = 'Pazarlama';Bu sorgu, hem İstanbul'da yaşayan hem de Pazarlama departmanında çalışan birini, sadece İstanbul'da yaşayan ama farklı bir departmanda olanı ve sadece Pazarlama departmanında olup farklı bir şehirde yaşayanı sonuç kümesine dahil edecektir.
OR KullanımıÜç farklı şehirden (Ankara, İzmir, Bursa) müşterileri listelemek için birden fazla OR operatörü kullanabilirsiniz.
SELECT MusteriAdi, Sehir
FROM Musteriler
WHERE Sehir = 'Ankara' OR Sehir = 'İzmir' OR Sehir = 'Bursa';Bu sorgu, Sehir sütunu değeri 'Ankara', 'İzmir' veya 'Bursa' olan tüm müşterilerin adını ve şehrini döndürecektir.
AND ve OR Operatörlerinin Birlikte KullanımıAND ve OR operatörlerini birlikte kullanırken işlem önceliğine dikkat etmek önemlidir. AND operatörü, OR operatöründen daha yüksek önceliğe sahiptir. Beklenmeyen sonuçları önlemek için parantez () kullanmak en iyi uygulamadır.
Örneğin, 'Elektronik' kategorisindeki ürünlerden, fiyatı 100'den yüksek OLAN VEYA stok adedi 50'den az OLAN ürünleri bulmak istiyoruz:
SELECT UrunAdi, Fiyat, StokAdedi, Kategori
FROM Urunler
WHERE (Fiyat > 100 OR StokAdedi < 50) AND Kategori = 'Elektronik';Bu sorguda parantezler, önce (Fiyat > 100 OR StokAdedi < 50) koşulunun değerlendirilmesini sağlar, ardından bu sonucun Kategori = 'Elektronik' koşuluyla AND operatörü ile birleştirilmesini sağlar.
Koşulun Doğruluğu: OR operatörü ile birleştirilen koşullardan herhangi biri doğru olduğunda, tüm ifade doğru kabul edilir ve ilgili satır sorgu sonucuna dahil edilir.
Performans Etkisi: Çok sayıda OR koşulu kullanmak veya indekslenmemiş sütunlar üzerinde OR uygulamak, sorgu performansını olumsuz etkileyebilir. Özellikle büyük veri kümelerinde bu duruma dikkat edilmelidir.
Parantez Kullanımı: AND ve OR operatörlerini aynı WHERE yan tümcesinde kullanırken, işlem önceliğini açıkça belirtmek ve mantıksal hataları önlemek için parantez () kullanmak hayati öneme sahiptir.
IN Operatörü Alternatifi: Bir sütunun birden fazla belirli değere eşit olup olmadığını kontrol etmek için OR operatörü yerine IN operatörünü kullanmak daha okunabilir ve genellikle daha performanslı bir alternatiftir. Örneğin, WHERE Sehir = 'Ankara' OR Sehir = 'İzmir' OR Sehir = 'Bursa' yerine WHERE Sehir IN ('Ankara', 'İzmir', 'Bursa') kullanımı tercih edilebilir.
                Python programlamada, verilerin farklı tipler arasında dönüştürülmesi sıkça karşılaşılan bir gereksinimdir. Bu süreç, casting olarak adlandırılır ve bir veri tipini başka bir veri tipine çevirmemizi sağlar. Python, bu dönüşümleri gerçekleştirmek için int(), float() ve str() gibi yerleşik fonksiyonlar sunar. Bu mekanizma, özellikle kullanıcı girdilerini işlerken, matematiksel hesaplamalar yaparken veya veriyi belirli bir formatta sunarken büyük önem taşır.
Python'da casting işlemleri, dönüştürülmek istenen yeni veri tipinin adını bir fonksiyon gibi kullanarak gerçekleştirilir. Genel sözdizimi aşağıdaki gibidir:
yeni_veri_tipi(dönüştürülecek_değer)Burada yeni_veri_tipi, dönüştürme yapılacak hedef veri tipini (örneğin, int, float, str) temsil ederken, dönüştürülecek_değer ise üzerinde işlem yapılacak olan değişken veya değeri ifade eder.
int() Fonksiyonu: Bu fonksiyon, bir değeri tam sayıya dönüştürmek için kullanılır. Kayan noktalı sayıları tam sayıya dönüştürürken ondalık kısmını keser (yuvarlama yapmaz). String değerleri dönüştürürken, stringin yalnızca geçerli bir sayısal tam sayı temsili olması gerekir, aksi takdirde bir ValueError hatası yükseltir.
float() Fonksiyonu: Bir değeri kayan noktalı sayıya dönüştürür. Tam sayıları ondalık kısım ekleyerek kayan noktalı sayıya çevirir (örn: 5 -> 5.0). String değerler için, stringin geçerli bir sayısal kayan noktalı sayı temsili olması gerekir, aksi takdirde ValueError hatası verir.
str() Fonksiyonu: Herhangi bir veri tipini string (metin) temsiline dönüştürür. Bu fonksiyon, sayıları, listeleri, sözlükleri ve diğer tüm veri tiplerini hatasız bir şekilde stringe çevirebilir. Çoğu zaman en güvenli casting işlemidir.
bool() Fonksiyonu: Bir değeri Boole (True veya False) tipine dönüştürür. Python'da belirli değerler "yanlış" (falsy) kabul edilir: 0, 0.0, boş string (""), boş liste ([]), boş tuple (()), boş sözlük ({}), boş küme (set()) ve None. Diğer tüm değerler "doğru" (truthy) kabul edilir.
Bir string ifadeyi tam sayıya ve kayan noktalı sayıya dönüştürme:
sayi_string = "123"
ondalik_string = "123.45"
# String'i int'e dönüştürme
int_sayi = int(sayi_string)
print(f"'{sayi_string}' (string) -> {int_sayi} (int)")
# String'i float'a dönüştürme
float_sayi = float(ondalik_string)
print(f"'{ondalik_string}' (string) -> {float_sayi} (float)")
# Hatalı string dönüşümü (ValueError)
# int("hello") # Bu satır bir hata yükseltir
# float("123a") # Bu satır bir hata yükseltirÇıktı:
'123' (string) -> 123 (int)
'123.45' (string) -> 123.45 (float)Tam sayı ve kayan noktalı sayıları stringe dönüştürme:
tam_sayi = 42
ondalik_sayi = 3.14
# int'i string'e dönüştürme
string_tam_sayi = str(tam_sayi)
print(f"{tam_sayi} (int) -> '{string_tam_sayi}' (string)")
print(f"Dönüşüm sonrası tip: {type(string_tam_sayi)}")
# float'ı string'e dönüştürme
string_ondalik_sayi = str(ondalik_sayi)
print(f"{ondalik_sayi} (float) -> '{string_ondalik_sayi}' (string)")
print(f"Dönüşüm sonrası tip: {type(string_ondalik_sayi)}")Çıktı:
42 (int) -> '42' (string)
Dönüşüm sonrası tip: 
3.14 (float) -> '3.14' (string)
Dönüşüm sonrası tip:  Kayan noktalı sayıları tam sayıya dönüştürürken ondalık kısmın nasıl kaybedildiğini gösterir:
pi_degeri = 3.14159
buyuk_ondalik = 9.99
# float'ı int'e dönüştürme (ondalık kısım kesilir)
int_pi = int(pi_degeri)
print(f"{pi_degeri} (float) -> {int_pi} (int)")
int_buyuk_ondalik = int(buyuk_ondalik)
print(f"{buyuk_ondalik} (float) -> {int_buyuk_ondalik} (int)")Çıktı:
3.14159 (float) -> 3 (int)
9.99 (float) -> 9 (int)Farklı değerlerin Boole karşılıkları:
print(f"bool(10)       -> {bool(10)}")
print(f"bool(0)        -> {bool(0)}")
print(f"bool(3.14)     -> {bool(3.14)}")
print(f"bool('')       -> {bool('')}")
print(f"bool('Merhaba') -> {bool('Merhaba')}")
print(f"bool([])       -> {bool([])}")
print(f"bool([1, 2])   -> {bool([1, 2])}")
print(f"bool(None)     -> {bool(None)}")Çıktı:
bool(10)       -> True
bool(0)        -> False
bool(3.14)     -> True
bool('')       -> False
bool('Merhaba') -> True
bool([])       -> False
bool([1, 2])   -> True
bool(None)     -> FalseVeri Kaybı Riski: Kayan noktalı bir sayıyı (float) tam sayıya (int) dönüştürürken, ondalık kısım kesilir. Bu, önemli bir veri kaybına yol açabilir. Örneğin, int(3.99) sonucu 3 olacaktır.
ValueError Hataları: String ifadeleri sayısal tiplere (int veya float) dönüştürürken, stringin içeriği hedef tip için geçerli bir sayısal formatı temsil etmelidir. Geçersiz bir string (örneğin, "abc" veya "123a") dönüştürülmeye çalışıldığında Python bir ValueError hatası yükseltecektir. Bu tür durumları try-except blokları ile ele almak iyi bir pratik olabilir.
Yeni Nesne Oluşturma: Casting işlemi, orijinal değişkenin tipini doğrudan değiştirmez; bunun yerine, dönüştürülmüş değeri içeren yeni bir nesne oluşturur. Orijinal değişkenin tipi aynı kalır.
str()'nin Güvenilirliği: str() fonksiyonu, Python'daki hemen hemen her veri tipini bir string temsiline dönüştürebilir. Bu, çoğu zaman en güvenli ve hatasız casting işlemidir.
Açık Casting Önemi: Python dinamik tipli bir dil olmasına rağmen, bazı durumlarda açıkça casting yapmak, kodun okunabilirliğini artırır, beklenmeyen davranışları önler ve veri tiplerinin doğru bir şekilde işlendiğinden emin olmanızı sağlar.
                HTML, içeriği yapılandırmak ve anlamlandırmak için çeşitli etiketler sunar. Bu etiketlerden bazıları, alıntıları, kısaltmaları ve iletişim bilgilerini belirtmek için kullanılır. Bu makalede, , , ,  ve  etiketlerinin doğru ve semantik olarak nasıl kullanılacağını teknik detaylarıyla inceleyeceğiz. Bu etiketler, belgenin okunabilirliğini artırmanın yanı sıra, arama motorları ve yardımcı teknolojiler için içeriğin anlamını zenginleştirir.
HTML'de alıntı ve ilgili içerikler için kullanılan ana etiketlerin temel sözdizimi aşağıdaki gibidir.
  Bu, uzun bir alıntıdır.
Kısa bir alıntı: Bu kısa bir alıntıdır.
Bir eserin başlığı: Eserin Adı
Bir kısaltma: Kısaltma
  Yazar Adı
  İletişim Bilgisi
Her bir etiket, belirli bir semantik amaca hizmet eder ve doğru kullanımı, web içeriğinin erişilebilirliğini ve arama motoru optimizasyonunu (SEO) önemli ölçüde etkiler.
: Bu etiket, genellikle başka bir kaynaktan alınan ve birden fazla satır veya paragraf içerebilecek uzun alıntılar için kullanılır. Tarayıcılar genellikle bu içeriği diğer metinlerden girintili olarak gösterir. cite özniteliği, alıntının yapıldığı orijinal kaynağın URL'sini belirtmek için kullanılabilir.
: Bu etiket, metin içinde yer alan kısa, satır içi alıntılar için kullanılır. Tarayıcılar, bu etiketin içeriğini otomatik olarak tırnak işaretleri içine alır. cite özniteliği,  etiketinde olduğu gibi, alıntının kaynağını belirtir.
: Bu etiket, bir eserin (kitap, makale, şarkı, film, heykel vb.) başlığını belirtmek için kullanılır. Yazarın adı için kullanılmamalıdır. Genellikle italik olarak görüntülenir.
: Kısaltmalar ve akronimler için kullanılır. title özniteliği, kısaltmanın veya akronimin tam açılımını içerir. Bu, kullanıcıların kısaltmanın ne anlama geldiğini anlamalarına yardımcı olur ve erişilebilirlik açısından önemlidir.
: En yakın  veya  öğesinin iletişim bilgilerini (yazarın adı, e-posta adresi, fiziksel adres, URL vb.) belirtmek için kullanılır. Genellikle italik olarak görüntülenir ve tarayıcılar tarafından paragraf sonu gibi ek boşluklarla ayrılabilir.
Aşağıdaki örnekler, yukarıda açıklanan etiketlerin gerçek dünya senaryolarında nasıl kullanılacağını göstermektedir.
)
  "Hayal gücü bilgiden daha önemlidir. Bilgi sınırlıdır. Hayal gücü ise tüm dünyayı kapsar."
  
)
Steve Jobs bir keresinde Bugün, Apple telefonu yeniden icat ediyor.
 demişti.
)
En sevdiğim kitaplardan biri Sefillerdir.
)
HTML, HTML kısaltmasıyla bilinir.
)
  Yazar: Jane Doe
  E-posta: jane.doe@example.com
  Web Sitesi: example.com
Semantik Doğruluk: Bu etiketlerin temel amacı, içeriğe doğru anlamsal anlam kazandırmaktır. Sadece görsel stil için kullanılmamalıdırlar. Örneğin, girintili bir metin için  kullanmak yerine CSS ile stil vermek daha uygundur, ancak metin gerçekten bir alıntıysa  kullanılmalıdır.
cite Özniteliği: Hem  hem de  etiketlerindeki cite özniteliği, alıntının kaynağını belirten bir URL içermelidir. Bu özniteliğin değeri görsel olarak tarayıcıda görüntülenmez, ancak arama motorları ve yardımcı teknolojiler tarafından okunabilir.
 ve Tırnak İşaretleri:  etiketi kullanıldığında, tarayıcılar içeriği otomatik olarak uygun tırnak işaretleriyle çevreler. Bu nedenle, metne manuel olarak tırnak işaretleri eklemekten kaçınılmalıdır.
 ve Yazar:  etiketi yalnızca eserin başlığı için kullanılır, yazarın adı için değil. Yazarın adını belirtmek için genellikle normal paragraf etiketleri veya  içinde metin kullanılır.
 Kapsamı:  etiketi, genellikle en yakın makalenin () yazarının veya belgenin () sahibinin iletişim bilgilerini belirtir. Genel bir posta adresi veya şirket adresi için kullanılmamalıdır.
Erişilebilirlik ve SEO: Bu etiketlerin doğru kullanımı, web içeriğinin ekran okuyucular gibi yardımcı teknolojiler için daha erişilebilir olmasını sağlar. Ayrıca, arama motorlarının içeriği daha iyi anlamasına ve dizine eklemesine yardımcı olarak SEO performansını artırabilir.
                SQL (Structured Query Language), veritabanlarını yönetmek ve sorgulamak için kullanılan güçlü bir dildir. Ancak, karmaşık sorgular veya uzun betikler yazarken, kodun anlaşılabilirliğini ve sürdürülebilirliğini sağlamak kritik önem taşır. İşte bu noktada yorum satırları devreye girer. Yorumlar, SQL kodunuzun belirli bölümlerini açıklamak, geçici olarak devre dışı bırakmak veya gelecekteki referanslar için notlar eklemek amacıyla kullanılır. Bu kılavuz, SQL dilinde yorum satırlarının nasıl kullanılacağını, temel sözdiziminden pratik örneklere kadar adım adım açıklamaktadır.
SQL, iki ana yorum satırı türünü destekler:
Tek Satırlık Yorumlar: Bir satırın geri kalanını yorum olarak işaretler.
Çok Satırlık Yorumlar: Birden fazla satırı veya bir satırın belirli bir bölümünü yorum olarak işaretler.
Her bir yorum türünün kendine özgü kullanım şekli ve avantajları bulunmaktadır. Doğru bağlamda doğru yorum türünü kullanmak, kodunuzun netliğini önemli ölçüde artırır.
--Tek satırlık yorumlar, iki kısa çizgi (`--`) ile başlar ve o satırın sonuna kadar devam eder. Bu yorumlar, genellikle belirli bir sorgu satırını veya bir ifadenin amacını açıklamak için kullanılır. Kodun sonuna eklenebileceği gibi, ayrı bir satırda da yer alabilir.
/* ... */Çok satırlık yorumlar, bir eğik çizgi ve bir yıldız işareti (`/*`) ile başlar ve bir yıldız işareti ve bir eğik çizgi (`*/`) ile sona erer. Bu yorumlar, başlangıç ve bitiş işaretleri arasındaki tüm metni, kaç satıra yayılırsa yayılsın, yorum olarak kabul eder. Çok satırlık yorumlar, karmaşık sorgu bloklarını açıklamak, yazar bilgilerini belirtmek veya büyük kod bölümlerini geçici olarak devre dışı bırakmak için idealdir. SQL standartlarına göre, çok satırlık yorumlar birbirini kapsayacak şekilde (iç içe) kullanılamaz.
Aşağıdaki örnekler, SQL yorum satırlarının farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Bu örnek, bir SELECT sorgusundaki her bir sütunun veya koşulun ne anlama geldiğini açıklamak için tek satırlık yorumların nasıl kullanılabileceğini gösterir.
SELECT
    CalisanID, -- Çalışanın benzersiz kimliği
    Ad,        -- Çalışanın adı
    Soyad,     -- Çalışanın soyadı
    Maas       -- Çalışanın mevcut maaşı
FROM
    Calisanlar
WHERE
    DepartmanID = 10; -- Yalnızca 'Satış' departmanındaki çalışanları getirYukarıdaki sorguda, her sütunun yanında veya WHERE koşulunun sonunda yer alan yorumlar, kodun ne yaptığını hızlıca anlamaya yardımcı olur.
Bu örnek, bir sorgunun genel amacını açıklamak veya bir fonksiyonun nasıl çalıştığına dair kapsamlı bilgi sağlamak için çok satırlık yorumların nasıl kullanılabileceğini gösterir.
/*
Bu sorgu, 'Musteriler' tablosundaki tüm müşterileri listeler.
Sorgu aşağıdaki bilgileri içerir:
- Müşteri Adı
- Müşteri Soyadı
- Kayıt Tarihi (YYYY-MM-DD formatında)
Bu sorgu, raporlama ve analiz amaçlı kullanılmaktadır.
*/
SELECT
    MusteriAd,
    MusteriSoyad,
    FORMAT(KayitTarihi, 'yyyy-MM-dd') AS KayitTarihiFormatted
FROM
    Musteriler
WHERE
    KayitTarihi >= '2023-01-01'
ORDER BY
    MusteriSoyad;Burada, sorgunun başında yer alan çok satırlık yorum, sorgunun genel işlevini ve içerdiği bilgileri detaylı bir şekilde açıklar.
Çok satırlık yorumlar, test veya hata ayıklama sırasında bir kod bloğunu geçici olarak devre dışı bırakmak için de kullanılabilir.
SELECT
    UrunID,
    UrunAd,
    Fiyat
FROM
    Urunler
/*
WHERE
    Kategori = 'Elektronik'
    AND Fiyat > 500;
*/
ORDER BY
    UrunAd;Bu örnekte, WHERE koşulu çok satırlık bir yorum içine alınarak geçici olarak devre dışı bırakılmıştır. Bu sayede, koşulun etkisini test etmek veya sorguyu koşulsuz çalıştırmak kolaylaşır.
Okunabilirlik Önceliği: Yorumları, kodun amacını ve karmaşık mantığını açıklamak için kullanın. Açık ve kendini açıklayan kod bölümlerini aşırı yorumlamaktan kaçının.
Nedenini Açıklayın, Ne Yaptığını Değil: Kodun ne yaptığını açıklamak yerine (çünkü kod zaten bunu gösterir), neden belirli bir şekilde yazıldığını, hangi iş gereksinimini karşıladığını veya potansiyel tuzakları belirtmek için yorumları kullanın.
Geçici Kod Devre Dışı Bırakma: Hata ayıklama veya kodun belirli bölümlerini test etme amacıyla kod bloklarını geçici olarak devre dışı bırakmak için çok satırlık yorumları etkili bir şekilde kullanabilirsiniz.
Sürdürülebilirlik: Yorumlar, kodunuzu gelecekteki geliştiriciler (veya kendiniz) için daha anlaşılır hale getirerek bakım maliyetlerini düşürür.
Performans Etkisi: Yorumlar, SQL sorgularının performansını etkilemez. Veritabanı motoru, sorguları çalıştırmadan önce yorumları ayrıştırır ve yok sayar.
Tutarlılık: Ekibinizle bir yorumlama standardı belirleyin ve buna uyun. Bu, kod tabanının genel okunabilirliğini artırır.
                Python programlama dilinde string (dize) veri tipi, metinsel verileri temsil etmek için kullanılan temel bir veri yapısıdır. Karakter dizilerinden oluşan stringler, isimlerden cümlelere, dosya yollarından web içeriklerine kadar çok çeşitli verilerin depolanması ve işlenmesi için vazgeçilmezdir. Bu makale, Python'da stringlerin nasıl tanımlandığını, temel sözdizimini ve çeşitli kullanım senaryolarını detaylı bir şekilde açıklamaktadır.
Python'da bir string oluşturmak için metni tek tırnak ('), çift tırnak (") veya üçlü tırnak (''' ya da """) arasına almanız yeterlidir. String değerleri bir değişkene atanabilir veya doğrudan kullanılabilir.
# Tek tırnak kullanarak string tanımlama
tek_tirnakli_string = 'Merhaba, Dünya!'
# Çift tırnak kullanarak string tanımlama
cift_tirnakli_string = "Python çok güçlüdür."
# Üçlü tırnak kullanarak çok satırlı string tanımlama
cok_satirli_string = '''Bu,
birden fazla
satıra yayılmış bir stringdir.'''
Python stringlerinin tanımlanmasında kullanılan farklı tırnak türleri ve özel karakterler, çeşitli senaryolarda esneklik sağlar:
Tek Tırnak (') ve Çift Tırnak ("): Bu iki yöntem, tek satırlık stringler için tamamen eşdeğerdir. Hangi yöntemin kullanılacağı genellikle kişisel tercihe veya stringin içinde diğer tırnak türlerinden birini barındırıp barındırmamasına bağlıdır. Örneğin, stringinizde tek tırnak varsa, dışı çift tırnakla tanımlamak karışıklığı önler ve kaçış karakteri kullanma ihtiyacını ortadan kaldırır.
Üçlü Tırnak (''' veya """): Üçlü tırnaklar, birden fazla satıra yayılan stringleri tanımlamak için kullanılır. Bu sayede her satır sonuna manuel olarak \n (yeni satır) kaçış karakteri eklemenize gerek kalmaz. Ayrıca, üçlü tırnaklar genellikle fonksiyonlar ve modüller için belgeleme stringleri (docstrings) yazmak için tercih edilir.
Kaçış Karakterleri (Escape Characters): Bazı özel karakterleri (örneğin, yeni satır, tab, veya string içinde kullanılan tırnak işareti) string içine eklemek için \ (ters eğik çizgi) ile başlayan kaçış dizileri kullanılır. En yaygın olanları \n (yeni satır), \t (tab), \' (tek tırnak), \" (çift tırnak) ve \\ (ters eğik çizgi) şeklindedir.
Ham Dizeler (Raw Strings): Bir string içindeki kaçış karakterlerinin özel anlamlarını kaybetmesini istiyorsanız, stringin başına r veya R harfini ekleyerek ham bir string oluşturabilirsiniz. Bu, özellikle dosya yolları gibi ters eğik çizgi içeren stringlerde kullanışlıdır, çünkü her ters eğik çizgiyi çiftleme ihtiyacını ortadan kaldırır.
Aşağıdaki örnekler, Python'da string tanımlamanın ve kullanmanın farklı yollarını göstermektedir.
# Örnek 1: Temel String Tanımlama
mesaj1 = "Merhaba Python!"
mesaj2 = 'Geliştiriciler için güçlü bir araç.'
print(mesaj1)
print(mesaj2)
# Çıktı:
# Merhaba Python!
# Geliştiriciler için güçlü bir araç.
# Örnek 2: Tırnak İşaretleri İçeren Stringler
# String içinde tek tırnak kullanmak için dışarıda çift tırnak kullanılır.
cift_tirnak_ici = "Bu, 'tek tırnak' içeren bir string."
print(cift_tirnak_ici)
# String içinde çift tırnak kullanmak için dışarıda tek tırnak kullanılır.
tek_tirnak_ici = 'Bu, "çift tırnak" içeren bir string.'
print(tek_tirnak_ici)
# Kaçış karakteri ile aynı tırnak türünü kullanma
kacis_karakterli = "Bu, \"çift tırnak\" içeren bir string."
print(kacis_karakterli)
# Çıktı:
# Bu, 'tek tırnak' içeren bir string.
# Bu, "çift tırnak" içeren bir string.
# Bu, "çift tırnak" içeren bir string.
# Örnek 3: Çok Satırlı Stringler
cok_satirli_mesaj = """
Bu bir
çok satırlı
mesajdır.
"""
print(cok_satirli_mesaj)
# Çıktı:
# 
# Bu bir
# çok satırlı
# mesajdır.
# 
# Örnek 4: Kaçış Karakterlerinin Kullanımı
yeni_satir = "İlk satır.\nİkinci satır."
tab_boslugu = "Ad\tSoyad"
ters_egik_cizgi = "C:\\Users\\Kullanici" # Ters eğik çizgi için iki tane kullanmalıyız
print(yeni_satir)
print(tab_boslugu)
print(ters_egik_cizgi)
# Çıktı:
# İlk satır.
# İkinci satır.
# Ad	Soyad
# C:\Users\Kullanici
# Örnek 5: Ham Dizeler (Raw Strings)
# Ham string kullanarak kaçış karakterlerini devre dışı bırakma
ham_dize = r"C:\Users\Kullanici\belgeler\yeni_dosya.txt"
print(ham_dize)
# Çıktı:
# C:\Users\Kullanici\belgeler\yeni_dosya.txt
Değiştirilemezlik (Immutability): Python'daki stringler değiştirilemez (immutable) veri tipleridir. Bu, bir string oluşturulduktan sonra içeriğinin doğrudan değiştirilemeyeceği anlamına gelir. String üzerinde bir işlem yaptığınızda (örneğin, birleştirme veya değiştirme), aslında yeni bir string nesnesi oluşturulur.
Dize Birleştirme: Birden fazla stringi birleştirmek için + operatörünü veya .join() metodunu kullanabilirsiniz. Büyük sayıda stringi birleştirmek için .join() metodu genellikle daha performanslıdır.
Dize Metotları: Python stringleri, metin manipülasyonu için zengin bir dizi yerleşik metoda sahiptir (örneğin, .upper(), .lower(), .strip(), .replace(), .split()). Bu metotlar, string nesneleri üzerinde çağrılarak yeni stringler döndürür.
F-stringler (Biçimlendirilmiş Dize Literalleri): Python 3.6 ve sonraki sürümlerinde tanıtılan f-stringler, stringleri değişken değerleriyle biçimlendirmenin son derece okunabilir ve etkili bir yoludur. Stringin başına f veya F koyularak tanımlanır ve süslü parantezler içinde değişken isimleri veya ifadeler doğrudan kullanılabilir.
                PHP'de isim alanları (namespaces), kod organizasyonunu ve çakışmaları önlemeyi sağlayan güçlü bir özelliktir. Büyük ölçekli uygulamalarda veya üçüncü taraf kütüphanelerle çalışırken, aynı isimde sınıfların, arayüzlerin, fonksiyonların veya sabitlerin tanımlanması olası bir sorundur. İsim alanları, bu tür isim çakışmalarını (name collision) engellemek ve kodun daha modüler, okunabilir ve yönetilebilir olmasını sağlamak için bir kapsülleme katmanı sunar.
Bir PHP dosyasında isim alanı tanımlamak için namespace anahtar kelimesi kullanılır.
İsim alanı sözdiziminin temel bileşenleri şunlardır:
namespace anahtar kelimesi: Bir dosya için isim alanı bildirimini başlatır. Bu bildirim, dosyadaki tüm sınıflar, arayüzler, özellikler (traits), fonksiyonlar ve sabitler için geçerlidir.
Vendor\Project\Module: Bu kısım, tanımlanan isim alanının adını temsil eder. Genellikle ters eğik çizgi (\) ile ayrılmış hiyerarşik bir yapı kullanılır. PHP topluluğu arasında kabul gören PSR-4 autoloading standardı, genellikle isim alanı adlarının vendor (sağlayıcı), project (proje) ve module/sub-module (modül/alt modül) yapısını takip etmesini önerir.
İsim alanı bildirimi, dosyanın en üstünde, declare anahtar kelimesinden sonra ve PHP kodundan önce yapılmalıdır. Tek bir dosyada birden fazla isim alanı bildirimine izin verilmez.
Global isim alanı: Herhangi bir namespace bildirimi olmayan tüm kodlar global isim alanı içinde kabul edilir. Bir isim alanı içinde global isim alanındaki bir sınıfa veya fonksiyona erişmek için \ öneki kullanılır (örneğin, \DateTime).
Aşağıdaki örnekler, isim alanlarının farklı senaryolarda nasıl kullanıldığını göstermektedir.
Örnek 1: Temel İsim Alanı Tanımı ve Kullanımı
İki farklı isim alanında aynı isimde sınıfların nasıl tanımlandığını ve kullanıldığını gösterir.
Çıktı:
Veritabanı bağlantısı oluşturuldu (App\Database).
API bağlantısı oluşturuldu (App\Api).Örnek 2: use Anahtar Kelimesi ile İsim Alanı İçe Aktarma
use anahtar kelimesi, tam nitelikli isimleri (FQN) kısaltmak ve kodu daha okunabilir hale getirmek için kullanılır.
log("Uygulama başlatıldı.");
$notifier = new EmailNotifier();
$notifier->notify("Yeni bir kullanıcı kaydoldu.");
$dbConn = new DbConnection(); // Takma ad ile kullanım
?>Çıktı:
Dosyaya loglandı: Uygulama başlatıldı.
E-posta ile bildirildi: Yeni bir kullanıcı kaydoldu.
Veritabanı bağlantısı oluşturuldu (App\Database).Örnek 3: İsim Alanı İçinde Global Fonksiyonlara Erişim
Bir isim alanı içinden global isim alanındaki bir fonksiyona veya sınıfa erişmek için \ öneki kullanılır.
format('Y-m-d H:i:s') . PHP_EOL;
// Helper sınıfı üzerinden fonksiyonu çağırma
echo "Rastgele Dize: " . Helper::generateRandomString(15) . PHP_EOL;
?>Çıktı:
Şu anki zaman (global): 2023-10-27 10:30:00 (Örnek tarih ve saat)
Rastgele Dize: aBcD1eF2gH3iJ4k (Örnek çıktı)Tek Dosya, Tek İsim Alanı: Genel kabul gören pratik, her PHP dosyasında yalnızca bir isim alanı bildirimi yapmaktır. Bu, kodun okunabilirliğini ve otomatikle yükleme (autoloading) mekanizmalarının düzgün çalışmasını sağlar.
PSR-4 Standardı: PHP topluluğu tarafından önerilen PSR-4 autoloading standardı, isim alanlarının dosya sistemi yapısıyla eşleşmesini teşvik eder. Örneğin, App\Database\Connection isim alanındaki bir sınıf genellikle src/App/Database/Connection.php yolunda bulunur.
Global Fonksiyonlara Erişim: Bir isim alanı içinde global bir fonksiyona veya sınıfa (örneğin strlen() veya DateTime) erişmek için başına \ koyarak tam nitelikli yolunu belirtmek iyi bir pratiktir (örneğin \strlen()). Bu, isim alanınızda aynı isimde bir fonksiyon veya sınıf tanımlandığında oluşabilecek belirsizliği önler.
use Bildiriminin Kapsamı: use bildirimleri, sadece tanımlandıkları dosya içinde geçerlidir ve mevcut isim alanını etkilemez. Her dosya için ayrı ayrı use bildirimleri yapılmalıdır.
İsim Alanı Gruplama Kullanımı: PHP 7'den itibaren, aynı kök isim alanına sahip birden fazla sınıfı veya fonksiyonu tek bir use bildirimi ile içe aktarmak mümkündür (örneğin, use App\Module\{ClassA, ClassB, FunctionC};).
Sınıf Adı Çakışmaları: İki farklı kütüphaneden gelen aynı isimli sınıfları kullanmanız gerektiğinde, use anahtar kelimesi ile as takma adını kullanarak çakışmaları çözebilirsiniz (örneğin, use MyVendor\Utility\Logger as MyLogger;).
                HTML geliştirme sürecinde, kodun okunabilirliğini artırmak, gelecekteki değişiklikleri kolaylaştırmak ve takım çalışmasını desteklemek amacıyla açıklamalara ihtiyaç duyulur. HTML yorumları, tarayıcılar tarafından göz ardı edilen ve web sayfasında görüntülenmeyen metin blokları eklemenin standart yoludur. Bu kılavuz, HTML yorumlarının sözdizimini, kullanım alanlarını ve en iyi pratiklerini detaylı bir şekilde ele alacaktır.
HTML yorumları,  karakter dizisiyle sona erer. Bu iki işaret arasında yer alan tüm içerik, tarayıcı tarafından yorumlanmaz ve sayfa üzerinde gösterilmez. Bu yapı, tek satırlık yorumlar veya birden çok satırı kapsayan yorumlar için kullanılabilir.
Yukarıdaki sözdiziminde:
 (kapanış etiketi): Yorum bloğunun sonunu belirtir.
HTML yorumları, çeşitli senaryolarda kodun yönetimini ve anlaşılırlığını artırmak için kullanılabilir.
1. Kodun Amacını Açıklama: Bu, özellikle karmaşık veya belirli bir işlevi olan kod bloklarının ne yaptığını belgelemek için kullanılır. Büyük projelerde veya takım ortamında kodun ne işe yaradığını hızlıca anlamak için kritik öneme sahiptir.
    Web Sitemize Hoş Geldiniz
    Bu sayfa, HTML yorumlarının kullanımını göstermektedir.
 2. Hata Ayıklama ve Geçici Kod Devre Dışı Bırakma: Bir kod bloğunun sayfa üzerindeki etkisini geçici olarak kaldırmak veya bir hatanın kaynağını izole etmek için kullanılabilir. Bu, belirli bir bölümü devre dışı bırakarak sayfanın diğer kısımlarını test etmeyi sağlar.
Bu paragraf görünür.
Bu paragraf da görünür.
3. Tarayıcıya Özel İçerik (Koşullu Yorumlar - Eski IE Sürümleri İçin): Bazı durumlarda, özellikle eski Internet Explorer sürümlerine özel koşullu yorumlar kullanılabilirdi. Bu, belirli bir tarayıcı sürümüne özel CSS veya JavaScript dosyalarını yüklemek için bir yöntemdi. Ancak modern web geliştirme pratiklerinde bu artık nadiren görülür ve genellikle tavsiye edilmez.
İç İçe Yorumlar: HTML yorumları iç içe kullanılamaz. Yani bir yorum bloğu içinde başka bir yorum bloğu açıp kapatmak beklenen davranışı göstermez ve genellikle hataya yol açar. Örneğin,  --> yapısı geçersizdir.
Güvenlik: HTML yorumları tarayıcıda görünmese de, sayfanın kaynak kodunda bulunurlar ve herkes tarafından incelenebilirler. Bu nedenle, hassas bilgileri (API anahtarları, parolalar vb.) asla HTML yorumlarında saklamayın.
Dosya Boyutu: Aşırıya kaçan veya gereksiz yorumlar, HTML dosyasının boyutunu artırabilir. Genellikle, kodu yeterince açıklayıcı kılan ve gereksiz tekrarı önleyen dengeli bir yaklaşım benimsenmelidir.
Kod Temizliği: Üretim ortamına canlıya alınacak kodlarda, geliştirme aşamasındaki geçici yorumları temizlemek iyi bir pratik olabilir. Çoğu otomatik kod küçültme (minifier) aracı, dosya boyutunu azaltmak için yorumları kaldırır.
Tarayıcı Desteği: HTML yorum sözdizimi, tüm modern web tarayıcıları tarafından tam olarak desteklenir ve herhangi bir uyumluluk sorunu yaratmaz.
                Cascading Style Sheets (CSS) dilinde padding özelliği, bir elementin içeriği ile kenarlığı arasındaki iç boşluğu ayarlamak için kullanılır. Bu boşluk, elementin görsel alanını genişletir ancak içeriğin kendisini etkilemez. Web sayfalarının düzeninde ve elementler arası görsel hiyerarşide kritik bir role sahiptir. padding, CSS Kutu Modeli'nin (Box Model) önemli bir bileşenidir ve elementlerin tarayıcıda nasıl render edileceğini doğrudan etkiler.
padding özelliği, bir elementin dört tarafındaki iç boşlukları (üst, sağ, alt, sol) tek tek veya toplu olarak tanımlamak için çeşitli sözdizimi biçimlerine sahiptir. En yaygın kullanımları aşağıdaki gibidir:
/* Tek tek özellikler */
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;
/* Kısaltılmış (shorthand) özellik - 4 değer */
padding:    ;
/* Kısaltılmış (shorthand) özellik - 3 değer */
padding:   ;
/* Kısaltılmış (shorthand) özellik - 2 değer */
padding:  ;
/* Kısaltılmış (shorthand) özellik - 1 değer */
padding: ;
              padding özelliği için atanabilecek değerler, piksel (px), yüzde (%), em (em), rem (rem) gibi uzunluk birimleri veya auto gibi anahtar kelimeler olabilir. Negatif değerler padding için geçerli değildir.
Tek Tek Özellikler:
padding-top, padding-right, padding-bottom ve padding-left özellikleri, elementin belirtilen tarafına doğrudan bir boşluk değeri atar. Bu yöntem, her taraf için farklı değerler gerektiğinde veya belirli bir tarafı hedeflemek istendiğinde kullanışlıdır.
Kısaltılmış (Shorthand) Özellik - Dört Değer:
padding: üst sağ alt sol; şeklinde kullanılır. Değerler saat yönünde atanır: üst, sağ, alt ve sol. Bu, her bir tarafa farklı bir boşluk vermek için en yaygın ve okunabilir yöntemdir.
Kısaltılmış (Shorthand) Özellik - Üç Değer:
padding: üst sağ-sol alt; şeklinde kullanılır. Birinci değer üst kenar için, ikinci değer hem sağ hem de sol kenarlar için, üçüncü değer ise alt kenar için geçerlidir.
Kısaltılmış (Shorthand) Özellik - İki Değer:
padding: üst-alt sağ-sol; şeklinde kullanılır. Birinci değer hem üst hem de alt kenarlar için, ikinci değer ise hem sağ hem de sol kenarlar için geçerlidir.
Kısaltılmış (Shorthand) Özellik - Tek Değer:
padding: tüm-taraflar; şeklinde kullanılır. Belirtilen tek değer, elementin dört kenarının (üst, sağ, alt, sol) tamamına uygulanır. Bu, tüm kenarlara eşit boşluk vermek istendiğinde en kısa yöntemdir.
Aşağıdaki örnekler, padding özelliğinin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Tek Değer Kullanımı
Tüm kenarlara eşit 20 piksel iç boşluk uygulanması.
.kutucuk-1 {
    background-color: lightblue;
    border: 1px solid blue;
    padding: 20px; /* Tüm kenarlara 20px iç boşluk */
}
Örnek 2: İki Değer Kullanımı
Üst ve alt kenarlara 15 piksel, sağ ve sol kenarlara 30 piksel iç boşluk uygulanması.
.kutucuk-2 {
    background-color: lightgreen;
    border: 1px solid green;
    padding: 15px 30px; /* Üst/Alt: 15px, Sağ/Sol: 30px */
}
Örnek 3: Dört Değer Kullanımı
Üst kenara 10 piksel, sağa 20 piksel, alta 30 piksel ve sola 40 piksel iç boşluk uygulanması.
.kutucuk-3 {
    background-color: lightcoral;
    border: 1px solid red;
    padding: 10px 20px 30px 40px; /* Üst: 10px, Sağ: 20px, Alt: 30px, Sol: 40px */
}
Örnek 4: Yüzde Değer Kullanımı
Elementin genişliğine göre yüzde bazında iç boşluk uygulanması. Yüzde değerler her zaman elementin genişliğine göre hesaplanır, yüksekliğine göre değil.
.kutucuk-4 {
    width: 200px;
    height: 100px;
    background-color: lightgray;
    border: 1px solid black;
    padding: 10% 5%; /* Üst/Alt: genişliğin %10'u, Sağ/Sol: genişliğin %5'i */
}
Box-sizing: border-box: Varsayılan olarak, padding bir elementin toplam genişliğine ve yüksekliğine eklenir. Bu durum, düzen hesaplamalarını karmaşıklaştırabilir. box-sizing: border-box; özelliğini kullanarak, padding ve border değerlerinin elementin belirtilen genişlik ve yüksekliğine dahil edilmesini sağlayabilirsiniz. Bu, daha öngörülebilir bir düzen oluşturmanıza yardımcı olur.
Negatif Değerler: padding özelliği için negatif değerler kullanılamaz. Negatif boşluklar yaratmak için margin özelliğini kullanmanız gerekir.
İçerik Genişliği: padding, elementin içeriği ile kenarlığı arasındaki mesafeyi artırdığı için, elementin görsel boyutunu genişletir. Ancak, içeriğin asıl genişliği (width değeri) değişmez, sadece etrafındaki boşluk artar.
Görsel Hiyerarşi: padding, metin veya diğer elementlerin kenarlara çok yakın durmasını engeller, böylece okunabilirliği ve genel kullanıcı deneyimini iyileştirir.
Kısaltılmış Kullanım Önceliği: Tek tek padding-top, padding-right vb. özellikleri tanımladıktan sonra, kısaltılmış padding özelliğini kullanırsanız, kısaltılmış özellik önceki tanımları geçersiz kılar. Bu nedenle, stil çakışmalarını önlemek için kullanım sırasına dikkat edin.
                İnternet dünyasının temel taşlarından biri olan PHP, web sitelerinin dinamik ve interaktif olmasını sağlayan güçlü bir programlama dilidir. Milyonlarca web sitesinin ve popüler web uygulamalarının arkasındaki teknoloji olan PHP, özellikle sunucu tarafı (server-side) web geliştirmede kendine sağlam bir yer edinmiştir. Peki, tam olarak PHP nedir? Nasıl çalışır ve neden bu kadar popülerdir? Bu kapsamlı rehberde, PHP'nin ne olduğunu, tarihçesini, temel özelliklerini, kullanım alanlarını, avantajlarını ve geleceğini detaylı bir şekilde inceleyeceğiz. Web geliştirme dünyasına adım atmak isteyenler veya mevcut bilgilerini pekiştirmek isteyenler için bu makale, PHP'nin derinliklerine inen bir yolculuk sunacak.
PHP, açılımı "Hypertext Preprocessor" olan, geniş ölçüde kullanılan, açık kaynaklı bir sunucu taraflı komut dosyası dilidir. Aslen "Personal Home Page" olarak başlayan bu isim, zamanla dilin yetenekleri genişledikçe değiştirilmiştir. PHP, özellikle web geliştirmeye odaklanmıştır ve HTML içine gömülebilir. Yani, bir HTML belgesi içerisinde PHP kodları yazabilir ve bu kodların sunucu tarafından işlenerek dinamik içerik üretmesini sağlayabilirsiniz.
PHP'nin temel amacı, statik HTML sayfalarının aksine, her kullanıcı isteğinde veya belirli koşullara göre değişebilen dinamik web sayfaları oluşturmaktır. Örneğin, bir kullanıcının oturum açtığında farklı bir içerik görmesi, bir e-ticaret sitesinde ürün listelerinin veritabanından çekilmesi veya bir blog sitesinde yorumların anında yayınlanması gibi işlevler, PHP gibi sunucu taraflı diller sayesinde mümkün olur. Bu dinamizm, web sitelerini daha etkileşimli, kişiselleştirilmiş ve güncel hale getirir.
PHP, sunucu üzerinde çalışır ve bir web tarayıcısı tarafından istenen bir PHP dosyasını işler. Sunucu, PHP kodunu çalıştırır, sonuçları (genellikle HTML olarak) oluşturur ve bu çıktıyı tarayıcıya gönderir. Tarayıcıya ulaşan tek şey, nihai HTML çıktısıdır; orijinal PHP kodu asla istemci tarafına gönderilmez. Bu, hem güvenlik hem de performans açısından önemli bir avantajdır.
PHP'nin hikayesi, 1994 yılında Rasmus Lerdorf adında bir geliştiricinin kendi kişisel ana sayfasını yönetmek için bir dizi C dilinde CGI (Common Gateway Interface) ikilisi yazmasıyla başladı. Bu araçlar, form verilerini işlemek ve MySQL veritabanlarıyla etkileşim kurmak gibi basit görevleri yerine getiriyordu. Lerdorf, bu araçları "Personal Home Page/Forms Interpreter" (PHP/FI) olarak adlandırdı ve 1995 yılında kaynak kodunu halka açık hale getirdi.
PHP/FI'nin popülaritesi hızla arttı ve diğer geliştiriciler de kendi web sitelerinde kullanmaya başladı. Geri bildirimler ve katkılarla dil gelişmeye devam etti. 1997 yılında, Andi Gutmans ve Zeev Suraski adında iki geliştirici, PHP/FI'nin çekirdeğini yeniden yazmaya karar verdi. Bu yeniden yazım, performans ve modülerlik açısından önemli iyileştirmeler getirdi ve "Zend Engine" adını aldı. 1998'de, bu yeni sürüm PHP 3.0 olarak piyasaya sürüldü ve dilin adını "PHP: Hypertext Preprocessor" olarak değiştirdi.
PHP 4.0, 2000 yılında piyasaya sürüldü ve daha da geliştirilmiş bir Zend Engine (Zend Engine 1.0) ile birlikte geldi. Bu sürüm, oturum desteği, çıktı tamponlama ve daha iyi web sunucusu entegrasyonu gibi önemli özellikler ekledi. PHP 4, dilin küresel çapta benimsenmesinde kritik bir rol oynadı.
2004 yılında, PHP 5.0, tamamen yeniden tasarlanmış bir Zend Engine (Zend Engine 2.0) ile birlikte çıktı. Bu sürüm, özellikle nesne yönelimli programlama (OOP) desteğini önemli ölçüde geliştirdi, XML ve veritabanı entegrasyonunu iyileştirdi ve birçok yeni özellik ekledi. PHP 5, uzun yıllar boyunca web geliştirmenin temel direği oldu.
En büyük sıçramalardan biri, 2015 yılında piyasaya sürülen PHP 7 serisi oldu. PHP 6 projesi başarısızlıkla sonuçlandıktan sonra, geliştiriciler doğrudan PHP 7'ye geçtiler. PHP 7, Zend Engine 3.0'ı tanıttı ve performans açısından devrim niteliğinde iyileştirmeler getirdi. PHP 5'e kıyasla çoğu uygulamada iki kat daha hızlı çalışabiliyordu. Ayrıca, yeni tür bildirimleri, anonim sınıflar ve daha birçok modern programlama özelliği eklendi.
PHP'nin en son büyük sürümü olan PHP 8, 2020 yılında yayınlandı. JIT (Just In Time) derleyici, nitelikler (attributes), adlandırılmış argümanlar, birleşim türleri (union types) ve match ifadesi gibi heyecan verici yeni özellikler sunarak dilin gücünü ve modernliğini daha da artırdı. PHP, sürekli gelişen, güncel ve performans odaklı bir dil olmaya devam etmektedir.
PHP'nin web geliştirme dünyasındaki kalıcı popülaritesi, sunduğu bir dizi önemli avantajdan kaynaklanmaktadır:
PHP'nin kullanım alanları oldukça geniştir ve internetin önemli bir bölümünü oluşturur. İşte PHP'nin en yaygın kullanıldığı bazı alanlar:
PHP'nin çalışma prensibi, bir web sitesini ziyaret ettiğinizde gerçekleşen adımları anlamak için önemlidir. İşte basit bir açıklama:
Bu süreç, her web sayfası isteği için tekrarlanır ve PHP'nin dinamik ve etkileşimli web deneyimleri sunmasını sağlar.
PHP'nin gücü, sadece dilin kendisinden değil, aynı zamanda etrafında inşa edilen zengin ekosistemden de gelir. Bu ekosistem, geliştiricilerin daha hızlı, daha verimli ve daha güvenli uygulamalar oluşturmasına yardımcı olan birçok araç, kütüphane ve çerçeve içerir.
Bazı dönemlerde "PHP öldü mü?" gibi sorular ortaya çıksa da, PHP her geçen gün kendini yenileyen ve geliştiren canlı bir dildir. PHP 7 ve PHP 8 ile gelen performans iyileştirmeleri, modern özellikler ve sürekli devam eden geliştirme süreçleri, dilin web geliştirme dünyasındaki yerini sağlamlaştırmıştır. Büyük teknoloji şirketleri (Facebook, Wikipedia) hala PHP'ye yatırım yapmakta, Laravel gibi çerçeveler yenilikçi çözümler sunmakta ve WordPress gibi CMS'ler milyonlarca siteye güç vermeye devam etmektedir. PHP, bulut tabanlı mimariler, mikro hizmetler ve API odaklı geliştirme gibi modern yaklaşımlara da başarıyla adapte olmaktadır. Bu nedenle, PHP'nin geleceği parlak ve web geliştirmenin vazgeçilmez bir parçası olmaya devam edecektir.
Eğer PHP öğrenmeye başlamak istiyorsanız, işte size bazı adımlar ve kaynaklar:
Bu bölümde, PHP hakkında en çok merak edilen bazı sorulara yanıt bulacaksınız.
PHP öğrenmek zor mu?
Hayır, PHP genel olarak öğrenmesi kolay bir dildir, özellikle web geliştirme dünyasına yeni başlayanlar için. Sözdizimi diğer bazı dillerden daha basittir ve geniş bir topluluk desteği ile bol miktarda kaynak mevcuttur. Temel HTML ve CSS bilginiz varsa, PHP'ye adapte olmanız daha da kolay olacaktır.
PHP hala popüler mi?
Kesinlikle evet. Bazı iddialara rağmen, PHP web geliştirme dünyasının en popüler dillerinden biri olmaya devam ediyor. Milyonlarca web sitesi, özellikle WordPress gibi büyük platformlar PHP ile çalışıyor. PHP 7 ve PHP 8 ile gelen performans iyileştirmeleri ve modern özellikler, dilin canlılığını korumasını sağlıyor.
PHP ile neler yapılabilir?
PHP ile dinamik web siteleri, e-ticaret platformları, bloglar, forumlar, sosyal medya siteleri, API'ler, İçerik Yönetim Sistemleri (CMS) ve hatta bazı komut satırı uygulamaları geliştirebilirsiniz. İnternette gördüğünüz çoğu dinamik içeriğin arkasında PHP veya benzeri bir sunucu taraflı dil bulunur.
PHP hangi veritabanlarıyla çalışır?
PHP, MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle ve MongoDB gibi birçok farklı veritabanıyla sorunsuz bir şekilde entegre olabilir. En yaygın kullanılanı MySQL'dir, ancak PHP'nin esnekliği sayesinde çoğu modern veritabanıyla çalışabilir.
PHP hangi işletim sistemlerinde çalışır?
PHP, platformdan bağımsız bir dildir. Linux, Windows, macOS ve Unix tabanlı sistemler dahil olmak üzere hemen hemen tüm büyük işletim sistemlerinde çalışabilir. Bu, geliştiricilere ve sunucu yöneticilerine büyük bir esneklik sunar.
PHP mi yoksa Python mu daha iyi?
Her iki dilin de kendine özgü güçlü yönleri vardır. PHP, web geliştirmeye odaklanmış ve bu alanda çok güçlü bir ekosisteme sahiptir. Python ise daha genel amaçlı bir dil olup web geliştirmeyle birlikte veri bilimi, yapay zeka ve otomasyon gibi alanlarda da yaygın olarak kullanılır. Seçim, projenizin gereksinimlerine ve kişisel tercihlerinize bağlıdır.
PHP mi yoksa JavaScript (Node.js) mi daha iyi?
PHP ve Node.js (JavaScript'in sunucu tarafı çalışma zamanı) her ikisi de sunucu tarafı geliştirme için popüler seçeneklerdir. PHP genellikle geleneksel web uygulamaları ve CMS'ler için tercih edilirken, Node.js gerçek zamanlı uygulamalar, mikro hizmetler ve tek sayfa uygulamalarının (SPA) API katmanları için güçlüdür. İki dil de modern web geliştirmede önemli bir rol oynar ve çoğu zaman birlikte kullanılırlar (örneğin, PHP bir web sitesinin arka ucunu sağlarken, JavaScript ön yüzü dinamik hale getirir).
                Merhaba sevgili içerik üreticisi adayları ve dijital dünya meraklıları! Bugün, birçoğumuzun hayalini süsleyen, yaratıcılığımızı gelire dönüştürebileceğimiz harika bir platformdan bahsedeceğiz: YouTube.
Belki de aklınızda harika bir video fikri var, belki de uzman olduğunuz bir konuda insanlara faydalı olmak istiyorsunuz. Ya da sadece ek gelir elde etmenin yeni yollarını arıyorsunuz. Her ne sebeple olursa olsun, YouTube, milyonlarca insana ulaşabileceğiniz ve potansiyelinizi keşfedebileceğiniz eşsiz bir alan sunuyor. Peki, bir YouTube kanalı açarak gerçekten gelir elde edebilir misiniz? Cevabımız kocaman bir evet! Ama bu yolculukta bilmeniz gereken bazı önemli adımlar ve stratejiler var. Hazırsanız, bu heyecan verici dünyaya birlikte dalalım.
Her büyük başarı hikayesi sağlam temeller üzerine kurulur. YouTube serüveninize başlarken de dikkat etmeniz gereken ilk adımlar var.
Nişinizi Belirleyin: Hangi konuda içerik üreteceksiniz? Oyun, makyaj, teknoloji, eğitim, gezi, yemek tarifleri... Seçenekler sınırsız. Önemli olan, hem tutkulu olduğunuz hem de bilgi sahibi olduğunuz bir alanı seçmek. Unutmayın, nişiniz ne kadar spesifik olursa, hedef kitlenize ulaşmanız o kadar kolaylaşır ve kendinizi o alanda bir otorite olarak konumlandırabilirsiniz. Nişinizi belirlemek, uzun vadeli başarınızın anahtarıdır.
Kanal Adı ve Markalaşma: Kanalınızın adı, markanızın ilk izlenimidir. Akılda kalıcı, nişinizle uyumlu ve telif hakkı sorunu olmayan bir isim seçin. Kanalınızın logosu, banner'ı ve genel görsel kimliği de profesyonel bir görünüm için kritik. Bu unsurlar, izleyicilerinizin kanalınızı tanımasını ve hatırlamasını sağlar.
Ekipman ve Başlangıç: Çoğu kişi "Profesyonel ekipmanım yok" diyerek başlama konusunda çekimser kalır. Ancak günümüzde iyi bir akıllı telefon bile başlangıç için yeterli olabilir! Önemli olan, iyi bir ışıklandırma ve net bir ses kalitesi sağlamaktır. Zamanla ve geliriniz arttıkça ekipmanınızı geliştirebilirsiniz. Asıl önemli olan içeriktir, ekipman değil.
İçerik Planlaması: Başarılı bir YouTube kanalı rastgele videolardan oluşmaz. Bir içerik takvimi oluşturmak, ne zaman ne tür videolar çekeceğinizi planlamak ve düzenli yayın akışı sağlamak izleyici sadakatini artırır. Konu araştırması yapın, senaryolarınızı hazırlayın ve çekim planınızı oluşturun.
YouTube'da kalıcı olmak ve gelir elde etmek istiyorsanız, kaliteli içerik üretmekten asla ödün vermemelisiniz.
Video Kalitesi: Görüntü kalitesi kadar ses kalitesi de çok önemlidir. Kimse cızırtılı veya anlaşılmayan bir sesi dinlemek istemez. İyi bir mikrofon edinmek, ilk yatırımınız olabilir. Videolarınızın çözünürlüğü yüksek olsun ve iyi bir ışıklandırma kullanmaya özen gösterin.
Kurgu ve Montaj: Videolarınızı sıkıcı olmaktan çıkaracak, akıcı ve dinamik bir kurgu yapın. Giriş, gelişme, sonuç dengesini iyi ayarlayın. Müzik, efektler ve metinler kullanarak videonuzu daha ilgi çekici hale getirin. Ücretsiz veya uygun fiyatlı montaj programlarıyla başlayabilirsiniz.
Başlıklar ve Küçük Resimler (Thumbnails): Videonuz ne kadar iyi olursa olsun, eğer kimse tıklamazsa izlenmez. Videonuzun başlığı ve küçük resmi, adeta bir vitrin gibidir. Merak uyandıran, videonun içeriğini yansıtan ve yüksek çözünürlüklü küçük resimler hazırlayın. Başlıklarınızda anahtar kelimeler kullanmayı unutmayın.
YouTube SEO: Videolarınızın keşfedilmesini sağlamak için YouTube SEO'sunu iyi kullanmalısınız. Videonuzun başlığına, açıklamasına ve etiketlerine alakalı anahtar kelimeler ekleyin. Açıklamalarınızı detaylı yazın, zaman damgaları ekleyin ve diğer videolarınıza veya ilgili kaynaklara bağlantılar verin. Bu, YouTube algoritmasının videonuzu doğru kitlelere ulaştırmasına yardımcı olur.
Para kazanmanın yolu, geniş ve sadık bir kitleye sahip olmaktan geçer. Kitlenizi büyütmek için sürekli çaba göstermelisiniz.
Düzenli Yayın Akışı: Belirli aralıklarla video yayınlamak, izleyicilerinizin ne zaman yeni içerik bekleyeceğini bilmesini sağlar ve sadakatlerini pekiştirir. Tutarlı olmak, YouTube algoritması tarafından da ödüllendirilir.
Yorumlara Cevap Verin: İzleyicilerinizle etkileşim kurmak, onlarla bir bağ kurmanın en iyi yoludur. Yorumlarına cevap verin, sorularını yanıtlayın ve onların fikirlerine değer verdiğinizi gösterin. Bu, topluluk hissini güçlendirir.
Sosyal Medya Entegrasyonu: YouTube kanalınızı diğer sosyal medya platformlarında da tanıtın. Instagram, TikTok, Twitter gibi platformlarda videolarınızdan kısa kesitler paylaşarak daha fazla kişiye ulaşın ve kanalınıza yönlendirin.
Ortak Çalışmalar (Collaborations): Benzer nişlerdeki diğer YouTuber'larla işbirliği yapmak, her iki tarafın da kitlesini genişletmek için harika bir yöntemdir. Farklı kitlelere ulaşarak abone sayınızı hızla artırabilirsiniz.
Şimdi gelelim asıl konuya: YouTube'dan nasıl para kazanılır? Tek bir yöntemle sınırlı kalmak yerine, gelirinizi çeşitlendirmek akıllıca olacaktır.
YouTube İş Ortağı Programı (AdSense): Bu, YouTube'dan para kazanmanın en bilinen yoludur. Kanalınızın belirli kriterleri (genellikle 1000 abone ve son 12 ayda 4000 saat genel izlenme süresi veya Shorts videolarında 90 günde 10 milyon geçerli izlenme) karşılaması halinde başvurabilirsiniz. Onaylandığınızda, videolarınızda gösterilen reklamlardan gelir elde edersiniz. Gelir, reklam türüne, izleyici demografisine ve reklamverenlerin bütçesine göre değişiklik gösterir. Bu, çoğu YouTuber için ilk gelir kapısıdır.
Marka İş Birlikleri ve Sponsorluklar: Kanalınız büyüdükçe, markalar ürünlerini veya hizmetlerini tanıtmanız için sizinle iletişime geçebilir. Bu, genellikle doğrudan bir ödeme karşılığında veya ürün değişimi şeklinde olur. Nişinizle alakalı ve izleyicilerinize fayda sağlayacak markalarla çalışmak, hem sizin hem de markanın itibarını artırır. Şeffaf olun ve sponsorlu içeriği her zaman belirtin.
Ürün Satışı (Merchandise): Kendi markanız altında tişört, kupa, şapka gibi ürünler satarak gelir elde edebilirsiniz. Özellikle sadık ve büyük bir kitleniz varsa, bu yöntem oldukça etkili olabilir. YouTube'un kendi merchandise rafı özelliği de bulunmaktadır.
Satış Ortaklığı (Affiliate Marketing): Videolarınızda bahsettiğiniz ürün veya hizmetlerin linklerini açıklama bölümüne ekleyerek, bu linkler üzerinden yapılan her satıştan komisyon kazanabilirsiniz. Amazon Ortaklık Programı gibi platformlar bu konuda size yardımcı olabilir. İzleyicilerinize gerçekten faydalı olabilecek ürünleri tavsiye etmeye özen gösterin.
Patreon ve Kitle Fonlaması: İzleyicileriniz, Patreon gibi platformlar aracılığıyla kanalınıza aylık belirli bir miktar ödeme yaparak doğrudan destek olabilirler. Karşılığında onlara özel içerikler, erken erişim veya diğer ayrıcalıklar sunabilirsiniz. Bu, özellikle niş ve sadık bir topluluğa sahip kanallar için harika bir gelir kaynağıdır.
Dijital Ürünler ve Hizmetler: Eğer bir uzmansanız, bilginizi e-kitaplar, online kurslar, danışmanlık hizmetleri veya premium içerikler gibi dijital ürün ve hizmetlere dönüştürebilirsiniz. YouTube kanalınız, bu ürünlerinizi tanıtmak ve satmak için güçlü bir platform görevi görür. Örneğin, bir fitness kanalı kişisel antrenman programları satabilir, bir dil öğrenme kanalı özel dersler verebilir.
YouTube Premium Geliri: YouTube Premium aboneleri, platformu reklamsız izlerler. Bu aboneler videolarınızı izlediğinde, YouTube bu gelirin bir kısmını içerik üreticileriyle paylaşır. Bu da ek bir pasif gelir kaynağıdır.
Süper Sohbet ve Süper Teşekkürler: Canlı yayınlar sırasında izleyicileriniz Süper Sohbet ile mesajlarını öne çıkarabilir veya Süper Teşekkürler ile favori videolarınıza doğrudan destek gönderebilir. Bu da izleyici katılımını teşvik eden ve ek gelir sağlayan özelliklerdir.
YouTube'da gelir elde etmek bir maraton, sprint değil. Bu yolculukta sizi motive tutacak ve başarıya taşıyacak bazı önemli noktalar var.
Sabırlı Olun ve Tutarlı Kalın: Hiçbir kanal bir gecede fenomen olmaz. Sabırla ve düzenli olarak içerik üretmeye devam edin. Başarı zamanla ve emekle gelecektir.
Analitikleri Takip Edin: YouTube Studio'daki analitik verileri düzenli olarak inceleyin. Hangi videolarınız daha çok izleniyor? İzleyicileriniz videonuzun hangi bölümünde ayrılıyor? Hangi demografik yapıya sahip izleyicileriniz var? Bu veriler, içerik stratejinizi geliştirmeniz için paha biçilmez bilgiler sunar.
Trendleri Yakalayın ama Kendiniz Olun: Popüler konuları ve trendleri takip etmek önemlidir, ancak kendi özgün sesinizi ve tarzınızı kaybetmeyin. Taklitçi olmak yerine, kendi benzersiz bakış açınızı sunun.
Geri Bildirimlere Açık Olun: İzleyicilerinizin yorumları ve eleştirileri, kendinizi geliştirmeniz için bir fırsattır. Olumlu ve yapıcı eleştirileri dikkate alın.
Ağ Kurun: Diğer içerik üreticileriyle iletişimde olun, topluluklara katılın. Tecrübe paylaşımı ve destek almak, bu yolculukta yalnız olmadığınızı hissettirecektir.
Gördüğünüz gibi, YouTube sadece bir video platformu değil, aynı zamanda ciddi bir gelir potansiyeli sunan, kendi işinizi kurabileceğiniz bir ekosistemdir. Başlamak için mükemmel anı beklemeyin, elinizdeki imkanlarla ilk adımı atın. Unutmayın, en büyük YouTuber'lar bile bir zamanlar sıfırdan başladı. Yaratıcılığınızı serbest bırakın, tutkunuzu paylaşın ve bu heyecan verici dijital dünyada kendi yerinizi oluşturun. Başarılar dileriz!
                JavaScript'te tarih ve saat verilerini yönetmek, görüntülemek ve üzerinde işlem yapmak için yerleşik Date nesnesi kullanılır. Bu nesne, milisaniyeler cinsinden zamanı temsil eder ve 1 Ocak 1970 UTC (Evrensel Eşgüdümlü Saat) tarihinden bu yana geçen süreyi temel alır. Date nesnesi ile mevcut tarihi ve saati alabilir, belirli bir tarihi oluşturabilir, tarih bileşenlerini değiştirebilir ve farklı formatlarda görüntüleyebilirsiniz.
Date nesnesi, new Date() yapıcı fonksiyonu kullanılarak dört farklı şekilde oluşturulabilir:
new Date(): Mevcut tarih ve saati içeren bir Date nesnesi oluşturur.
new Date(milisaniye): 1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını temsil eden bir Date nesnesi oluşturur.
new Date(tarihDizisi): Bir tarih dizisini (örneğin, "2023-10-26" veya "October 26, 2023 10:30:00") ayrıştırarak bir Date nesnesi oluşturur.
new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye): Belirli tarih ve saat bileşenleriyle bir Date nesnesi oluşturur. Ay değeri 0'dan (Ocak) 11'e (Aralık) kadar indeklenmiştir.
Date nesnesinin yapıcı fonksiyonları ve yöntemleri, tarih ve saat manipülasyonu için güçlü araçlar sunar:
new Date(): Argüman olmadan çağrıldığında, Date nesnesi, komutun çalıştırıldığı yerel sistemin mevcut tarih ve saatini temsil eder.
new Date(milisaniye): Bu yapıcı, new Date(0) ile 1 Ocak 1970 UTC başlangıcını temsil eder. Pozitif değerler bu tarihten sonrasını, negatif değerler ise öncesini ifade eder. Örneğin, new Date(86400000) 1 Ocak 1970 UTC'den 24 saat sonrasını temsil eder.
new Date(tarihDizisi): JavaScript, çeşitli ISO 8601 formatlarını (örneğin, "YYYY-MM-DD", "YYYY-MM-DDTHH:mm:ssZ") ve tarayıcıya özgü bazı diğer tarih dizisi formatlarını ayrıştırabilir. Ancak, tarayıcılar arası tutarlılık için ISO 8601 formatları tercih edilmelidir.
new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye): Bu yapıcı, tarih bileşenlerini doğrudan belirterek kesin bir tarih ve saat oluşturmanıza olanak tanır. ay parametresinin 0-indeksli olduğunu unutmamak önemlidir. Örneğin, Ekim ayı için 9 değeri kullanılır. gün, saat, dakika, saniye ve milisaniye parametreleri isteğe bağlıdır ve belirtilmezse varsayılan olarak 1 (gün için) veya 0 (diğerleri için) değerini alırlar.
Date nesnesinin birçok yöntemi vardır. Bunlar genellikle iki kategoriye ayrılır: yerel zaman dilimine göre (getFullYear(), getMonth()) ve UTC'ye göre (getUTCFullYear(), getUTCMonth()) çalışan yöntemler. Benzer şekilde, tarih bileşenlerini ayarlamak için setFullYear() veya setUTCFullYear() gibi yöntemler mevcuttur.
Mevcut tarih ve saati alıp görüntüleme:
const simdi = new Date();
console.log(simdi); // Örnek çıktı: Thu Oct 26 2023 10:30:00 GMT+0300 (Türkiye Standart Saati)
console.log(simdi.toLocaleDateString()); // Örnek çıktı: 26.10.2023
console.log(simdi.toLocaleTimeString()); // Örnek çıktı: 10:30:00
console.log(simdi.toISOString()); // Örnek çıktı: 2023-10-26T07:30:00.000Z (UTC formatında)Belirli bir tarih ve saat oluşturma:
// Yıl, ay (0-indeksli), gün, saat, dakika, saniye, milisaniye
const dogumGunu = new Date(1990, 4, 15, 12, 0, 0, 0); // 15 Mayıs 1990, 12:00:00
console.log(dogumGunu.toDateString()); // Örnek çıktı: Tue May 15 1990
// Tarih dizisi kullanarak
const yaziIleTarih = new Date("2024-01-20T14:30:00Z"); // UTC olarak 20 Ocak 2024, 14:30:00
console.log(yaziIleTarih.toLocaleString()); // Tarayıcının yerel ayarına göre görüntülenirTarih bileşenlerini alma:
const bugun = new Date();
const yil = bugun.getFullYear(); // Yılı alır (örneğin, 2023)
const ay = bugun.getMonth();   // Ayı alır (0-11, Ocak 0'dır)
const gun = bugun.getDate();    // Ayın gününü alır (1-31)
const gunAdi = bugun.getDay();  // Haftanın gününü alır (0-6, Pazar 0'dır)
const saat = bugun.getHours();  // Saati alır (0-23)
const dakika = bugun.getMinutes(); // Dakikayı alır (0-59)
const saniye = bugun.getSeconds(); // Saniyeyi alır (0-59)
const milisaniye = bugun.getMilliseconds(); // Milisaniyeyi alır (0-999)
const zamanDamgasi = bugun.getTime(); // 1 Ocak 1970'ten bu yana geçen milisaniye sayısı
console.log(`Yıl: ${yil}, Ay: ${ay + 1}, Gün: ${gun}, Saat: ${saat}:${dakika}`);Tarih bileşenlerini ayarlama:
const gelecektekiTarih = new Date();
gelecektekiTarih.setFullYear(2025);
gelecektekiTarih.setMonth(0); // Ocak
gelecektekiTarih.setDate(1); // Ayın 1. günü
gelecektekiTarih.setHours(9);
gelecektekiTarih.setMinutes(0);
gelecektekiTarih.setSeconds(0);
gelecektekiTarih.setMilliseconds(0);
console.log(gelecektekiTarih.toLocaleString()); // Örnek çıktı: 1.01.2025 09:00:00Tarihler arası fark hesaplama:
const tarih1 = new Date('2023-10-01');
const tarih2 = new Date('2023-10-31');
const farkMilisaniye = tarih2.getTime() - tarih1.getTime();
const farkGun = farkMilisaniye / (1000 * 60 * 60 * 24);
console.log(`İki tarih arasındaki gün farkı: ${farkGun}`); // Çıktı: 30Ay İndekslemesi: Date nesnesinin yapıcı fonksiyonunda ve getMonth(), setMonth() gibi yöntemlerinde ay değerleri 0'dan 11'e kadar indekslenir (0 = Ocak, 11 = Aralık). Bu yaygın bir hata kaynağıdır.
Saat Dilimi Farklılıkları: Date nesnesi, genellikle yerel saat dilimini kullanır. Ancak, getUTCFullYear(), setUTCHours() gibi UTC ön ekli yöntemler, Evrensel Eşgüdümlü Saat'e göre işlem yapar. Bu durum, özellikle uluslararası uygulamalarda veya sunucu-istemci iletişimi sırasında önemlidir. Tarihleri UTC formatında depolayıp, kullanıcının yerel saat dilimine göre görüntülemek iyi bir pratiktir.
String Ayrıştırma Güvenilirliği: new Date(tarihDizisi) yapıcı fonksiyonu, farklı tarayıcılarda ve JavaScript motorlarında farklı dizileri ayrıştırabilir. En güvenilir yöntem, ISO 8601 formatında tarih dizileri kullanmak (örneğin, "YYYY-MM-DDTHH:mm:ss.sssZ" veya "YYYY-MM-DD").
Date.now(): Bu statik yöntem, 1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını döndürür ve bir Date nesnesi oluşturmadan anlık zaman damgasını almak için hızlı bir yoldur. Performans açısından new Date().getTime()'dan daha etkilidir.
Geçersiz Tarihler: Geçersiz bir tarih oluşturmaya çalışırsanız (örneğin, 31 Şubat), Date nesnesi "Invalid Date" (Geçersiz Tarih) döndürür. Bu durumu isNaN(date.getTime()) ile kontrol edebilirsiniz.
                Python'da Booleans, programlama mantığının temelini oluşturan, yalnızca iki olası değere sahip özel bir veri tipidir: True ve False. Bu değerler, koşullu ifadelerde, döngülerde ve genel program akış kontrolünde kararlar almak için kullanılır. Mantıksal işlemlerin sonucunu temsil ederler ve bir durumun doğru mu yanlış mı olduğunu belirtirler. Python'da, bool sınıfının bir örneği olarak kabul edilirler ve dahili olarak sırasıyla 1 ve 0 tam sayı değerlerine karşılık gelirler.
Python'da boolean değerleri doğrudan True ve False anahtar kelimeleri kullanılarak ifade edilir. Bu anahtar kelimeler büyük harfle başlar ve Python'ın ayrılmış kelimeleridir.
True: Mantıksal olarak "doğru" anlamına gelir. Bir koşulun karşılandığını veya bir ifadenin geçerli olduğunu belirtir.
False: Mantıksal olarak "yanlış" anlamına gelir. Bir koşulun karşılanmadığını veya bir ifadenin geçersiz olduğunu belirtir.
Python'da birçok veri tipi ve ifade, boolean bağlamında değerlendirildiğinde dolaylı olarak bir boolean değere sahiptir. Örneğin, boş stringler (""), boş listeler ([]), boş sözlükler ({}), 0 sayısı ve None değeri False olarak değerlendirilirken; sıfırdan farklı sayılar, dolu stringler ve dolu koleksiyonlar True olarak değerlendirilir. Bu duruma "truthiness" denir ve bool() fonksiyonu ile açıkça kontrol edilebilir.
Örnek 1: Basit Atama ve Kontrol
Bir değişkene boolean değeri atayarak ve bu değeri kullanarak koşullu bir ifade çalıştırmak için aşağıdaki kodu inceleyebiliriz.
is_active = True
is_admin = False
if is_active:
    print("Kullanıcı aktif.")
else:
    print("Kullanıcı pasif.")
if is_admin:
    print("Yönetici yetkilerine sahip.")
else:
    print("Yönetici yetkilerine sahip değil.")Örnek 2: Karşılaştırma Operatörleri
Karşılaştırma operatörleri (==, !=, <, >, <=, >=) her zaman bir boolean değeri döndürür.
x = 10
y = 20
print(f"x == y: {x == y}")
print(f"x != y: {x != y}")
print(f"x < y: {x < y}")
print(f"x > y: {x > y}")Örnek 3: Mantıksal Operatörler
Mantıksal operatörler (and, or, not) boolean değerleri birleştirmek veya tersine çevirmek için kullanılır.
has_permission = True
is_logged_in = True
is_subscriber = False
if has_permission and is_logged_in:
    print("Erişim granted.")
if has_permission or is_subscriber:
    print("En az bir koşul doğru.")
if not is_subscriber:
    print("Abone değil.")Örnek 4: bool() Fonksiyonu ile Değerlendirme
Bir ifadenin boolean bağlamında nasıl değerlendirileceğini bool() fonksiyonu ile açıkça görebiliriz.
print(f"bool(0): {bool(0)}")
print(f"bool(1): {bool(1)}")
print(f"bool(''): {bool('')}")
print(f"bool('Hello'): {bool('Hello')}")
print(f"bool([]): {bool([])}")
print(f"bool([1, 2]): {bool([1, 2])}")
print(f"bool(None): {bool(None)}")True ve False anahtar kelimeleri Python'da büyük harfle başlar. Küçük harfle yazmak (örneğin, true veya false) bir hata ile sonuçlanır çünkü bunlar ayrılmış anahtar kelimelerdir ve değişken adları olarak algılanmazlar.
Boolean değerleri, dahili olarak sırasıyla 1 ve 0 tamsayı değerlerine karşılık gelir. Bu, bazen aritmetik işlemlerde veya tip dönüştürmelerde ilginç sonuçlar doğurabilir; örneğin, True + True ifadesi 2 sonucunu verir.
Karşılaştırma ve mantıksal operatörler, koşullu ifadeler ve döngüler için vazgeçilmezdir. Programınızın akışını kontrol etmek için bu operatörleri doğru bir şekilde kullanmak kritik öneme sahiptir.
bool() fonksiyonu, herhangi bir Python nesnesinin boolean karşılığını elde etmek için kullanılabilir. Bu, özellikle bir koleksiyonun boş olup olmadığını veya bir değişkenin değer içerip içermediğini kontrol etmek için faydalıdır.
                JavaScript, web geliştirmede dinamik ve etkileşimli deneyimler oluşturmak için vazgeçilmez bir dildir. Bu dilin temel yapı taşlarından biri olan diziler (arrays), birden çok değeri tek bir değişken altında depolamamızı ve yönetmemizi sağlar. Diziler, veri koleksiyonlarını düzenli bir şekilde saklamak, üzerlerinde döngüler yapmak ve çeşitli manipülasyonlar gerçekleştirmek için kritik öneme sahiptir. Bu makalede, JavaScript dizilerinin temel sözdizimini, öğelere erişimi, yaygın kullanılan metotları ve pratik uygulama örneklerini detaylı bir şekilde inceleyeceğiz.
JavaScript'te dizi oluşturmanın ve kullanmanın iki temel yolu vardır:
Bu, en yaygın ve önerilen yöntemdir. Köşeli parantezler [] arasına, virgülle ayrılmış olarak dizi öğeleri yazılır.
const meyveler = ["Elma", "Muz", "Portakal"];
let sayilar = [1, 2, 3, 4, 5];
const karisikDizi = ["Metin", 123, true, null, {adi: "Nesne"}];Yukarıdaki örneklerde görüldüğü gibi, bir dizi içinde farklı veri tiplerini barındırabiliriz. Diziler const, let veya var anahtar kelimeleri ile tanımlanabilir.
new Array() kurucu fonksiyonunu kullanarak da dizi oluşturulabilir. Bu yöntem daha az tercih edilse de, belirli senaryolarda kullanılabilir.
const meyveler = new Array("Elma", "Muz", "Portakal");
const bosDizi = new Array(); // Boş bir dizi oluşturur
const onElemanliDizi = new Array(10); // 10 boş öğe içeren bir dizi oluştururTek bir sayısal argümanla çağrıldığında, new Array() o boyutta boş öğeler içeren bir dizi oluşturur. Birden fazla argümanla çağrıldığında ise, bu argümanlar dizinin öğeleri haline gelir.
Dizilerdeki öğelere, sıfır tabanlı indeksleme kullanarak erişilir. Yani, ilk öğenin indeksi 0, ikincisinin 1 ve bu şekilde devam eder. Öğelere erişmek için dizi adından sonra köşeli parantez içinde indeks numarası belirtilir.
const renkler = ["Kırmızı", "Yeşil", "Mavi"];
console.log(renkler[0]); // Çıktı: Kırmızı
console.log(renkler[1]); // Çıktı: YeşilDizi öğelerini değiştirmek de benzer şekilde yapılır. İstenen indeks belirtilerek yeni bir değer atanır:
renkler[2] = "Sarı";
console.log(renkler); // Çıktı: ["Kırmızı", "Yeşil", "Sarı"]Bir dizinin toplam öğe sayısını öğrenmek için length özelliğini kullanırız:
console.log(renkler.length); // Çıktı: 3Bu örnek, bir dizi tanımlamayı ve belirli indekslerdeki öğelere nasıl erişileceğini göstermektedir.
// Bir meyve dizisi tanımlama
const meyveler = ["Elma", "Armut", "Kiraz", "Çilek"];
// Dizinin ilk elemanına erişme (indeks 0)
console.log("İlk meyve:", meyveler[0]); // Çıktı: İlk meyve: Elma
// Dizinin üçüncü elemanına erişme (indeks 2)
console.log("Üçüncü meyve:", meyveler[2]); // Çıktı: Üçüncü meyve: Kiraz
// Dizinin son elemanına erişme (length - 1)
console.log("Son meyve:", meyveler[meyveler.length - 1]); // Çıktı: Son meyve: ÇilekBu örnek, var olan bir dizi öğesinin nasıl değiştirileceğini ve dizinin sonuna/başına öğe ekleme/çıkarma işlemlerini göstermektedir.
let alisverisListesi = ["Süt", "Ekmek", "Yumurta"];
// İkinci öğeyi değiştirme (indeks 1)
alisverisListesi[1] = "Peynir";
console.log("Değişen liste:", alisverisListesi); // Çıktı: Değişen liste: ["Süt", "Peynir", "Yumurta"]
// Dizinin sonuna yeni bir öğe ekleme (push metodu)
alisverisListesi.push("Meyve Suyu");
console.log("Ekleme sonrası:", alisverisListesi); // Çıktı: Ekleme sonrası: ["Süt", "Peynir", "Yumurta", "Meyve Suyu"]
// Dizinin sonundaki öğeyi çıkarma (pop metodu)
const cikarilanOge = alisverisListesi.pop();
console.log("Çıkarılan öğe:", cikarilanOge); // Çıktı: Çıkarılan öğe: Meyve Suyu
console.log("Çıkarma sonrası:", alisverisListesi); // Çıktı: Çıkarma sonrası: ["Süt", "Peynir", "Yumurta"]
// Dizinin başına yeni bir öğe ekleme (unshift metodu)
alisverisListesi.unshift("Yoğurt");
console.log("Başına ekleme:", alisverisListesi); // Çıktı: Başına ekleme: ["Yoğurt", "Süt", "Peynir", "Yumurta"]
// Dizinin başındaki öğeyi çıkarma (shift metodu)
const cikarilanBasOge = alisverisListesi.shift();
console.log("Baştan çıkarılan öğe:", cikarilanBasOge); // Çıktı: Baştan çıkarılan öğe: Yoğurt
console.log("Baştan çıkarma sonrası:", alisverisListesi); // Çıktı: Baştan çıkarma sonrası: ["Süt", "Peynir", "Yumurta"]Dizi öğeleri üzerinde işlem yapmak için döngüler sıkça kullanılır. En yaygın yöntemlerden biri for döngüsü ve forEach() metodudur.
const ogrenciler = ["Ali", "Ayşe", "Mehmet", "Fatma"];
// For döngüsü ile dizi öğelerini listeleme
console.log("For döngüsü ile öğrenciler:");
for (let i = 0; i < ogrenciler.length; i++) {
  console.log(ogrenciler[i]);
}
// forEach() metodu ile dizi öğelerini listeleme
console.log("\nforEach() ile öğrenciler:");
ogrenciler.forEach(function(ogrenci, index) {
  console.log(`${index + 1}. ${ogrenci}`);
});Dinamik Boyut: JavaScript dizileri dinamik yapıdadır. Oluşturulduktan sonra boyutları otomatik olarak büyüyüp küçülebilir. Önceden bir boyut belirtme zorunluluğu yoktur.
Karışık Veri Tipleri: JavaScript dizileri, aynı anda string, number, boolean, object, null, undefined gibi farklı veri tiplerini barındırabilir.
Referans Tipi: Diziler birer referans tipi (reference type) veri yapısıdır. Bir diziyi başka bir değişkene atadığınızda, aslında dizinin kendisi değil, bellekteki referansı kopyalanır. Bu nedenle, yeni değişken üzerinden yapılan değişiklikler orijinal diziyi de etkiler.
const ile Dizi Tanımlama: const ile tanımlanan bir dizinin referansı değiştirilemez, yani başka bir dizi atanması mümkün değildir. Ancak, dizinin içindeki öğeler (indeksler üzerinden) değiştirilebilir veya dizi metotları (push, pop vb.) ile manipüle edilebilir.
const sabitDizi = [1, 2, 3];
sabitDizi.push(4); // Geçerli: [1, 2, 3, 4]
// sabitDizi = [5, 6]; // Hata: Assignment to constant variable.Dizi Metotları: JavaScript, dizilerle çalışmayı kolaylaştıran zengin bir dizi metotları setine sahiptir (map(), filter(), reduce(), find(), splice(), slice() vb.). Bu metotlar, diziler üzerinde daha gelişmiş işlemler yapmak için kullanılır ve modern JavaScript programlamasında kritik öneme sahiptir.
                Veritabanı yönetim sistemlerinde, bir sütundaki veri değerinin bilinmediğini, uygulanabilir olmadığını veya henüz atanmadığını belirtmek için NULL anahtar kelimesi kullanılır. Bu özel değer, diğer veri türlerinden farklı olarak, bir sayıyı (örneğin 0) veya boş bir karakter dizisini (örneğin '') temsil etmez; aksine, bir değerin yokluğunu veya belirsizliğini ifade eder. SQL sorgularında NULL değerlerle doğru bir şekilde çalışabilmek, veri bütünlüğünü sağlamak ve beklenen sonuçları elde etmek için kritik öneme sahiptir.
SQL'de NULL değerleri sorgulamak ve yönetmek için genellikle IS NULL, IS NOT NULL operatörleri ve COALESCE gibi özel fonksiyonlar kullanılır. Temel kullanım yapıları aşağıdaki gibidir:
-- Bir sütunda NULL değerleri seçmek için:
SELECT column_name(s)
FROM table_name
WHERE column_name IS NULL;
-- Bir sütunda NULL olmayan değerleri seçmek için:
SELECT column_name(s)
FROM table_name
WHERE column_name IS NOT NULL;
-- NULL değerleri alternatif bir değerle değiştirmek için:
SELECT COALESCE(column_name, default_value) AS new_column_name
FROM table_name;
NULL Nedir?
SQL'deki NULL, bir değerin yokluğunu temsil eder. Bu, bir sütunun o satır için herhangi bir bilgi içermediği veya bu bilginin bilinmediği anlamına gelir. NULL, sıfırdan, boş bir karakter dizisinden veya boşluktan farklıdır. Örneğin, bir kullanıcının telefon numarasının NULL olması, o kullanıcının telefon numarasının olmadığını veya bilinmediğini ifade eder; '0' olması ise telefon numarasının 0 olduğunu gösterir.
IS NULL Operatörü
IS NULL operatörü, belirli bir sütundaki değerin NULL olup olmadığını kontrol etmek için kullanılır. Geleneksel karşılaştırma operatörleri (=, <>, !=) NULL değerlerle doğru şekilde çalışmadığı için bu operatör zorunludur. WHERE koşulunda kullanılarak, belirtilen sütunda NULL değeri bulunan tüm satırları döndürür.
IS NOT NULL Operatörü
IS NOT NULL operatörü, IS NULL operatörünün zıttıdır. Bir sütundaki değerin NULL olmadığını kontrol etmek için kullanılır. Bu operatör, belirli bir sütunda geçerli (NULL olmayan) bir değere sahip olan tüm satırları seçmek istediğinizde faydalıdır.
COALESCE Fonksiyonu
COALESCE fonksiyonu, kendisine verilen ifadeler listesinden NULL olmayan ilk ifadeyi döndürür. Bu fonksiyon, bir sütundaki NULL değerleri okunaklı bir varsayılan değerle (örneğin 'Bilinmiyor' veya 0) değiştirmek istediğinizde çok kullanışlıdır. Eğer tüm ifadeler NULL ise, COALESCE de NULL döndürür.
NULL ile Karşılaştırmalar
SQL'de NULL değerleri doğrudan diğer değerlerle (hatta başka bir NULL ile bile) = veya <> gibi operatörlerle karşılaştırmak her zaman UNKNOWN (bilinmeyen) sonucunu verir. Örneğin, NULL = NULL ifadesi TRUE döndürmez, UNKNOWN döndürür. Bu nedenle, NULL değerleri test etmek için mutlaka IS NULL veya IS NOT NULL operatörleri kullanılmalıdır.
Aşağıdaki örnekler, NULL değerlerin SQL sorgularında nasıl kullanıldığını göstermektedir. İlk olarak, örnek bir tablo oluşturalım ve içine veri ekleyelim:
-- 1. Örnek Tablo Oluşturma ve Veri Ekleme
CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50) NOT NULL,
    Soyad VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    Telefon VARCHAR(15),
    DepartmanID INT
);
INSERT INTO Calisanlar (CalisanID, Ad, Soyad, Email, Telefon, DepartmanID) VALUES
(1, 'Ayşe', 'Yılmaz', 'ayse.yilmaz@example.com', '5551234567', 101),
(2, 'Mehmet', 'Demir', NULL, '5557654321', 102),
(3, 'Zeynep', 'Kaya', 'zeynep.kaya@example.com', NULL, 101),
(4, 'Ali', 'Can', 'ali.can@example.com', '5559876543', 103),
(5, 'Elif', 'Aksoy', NULL, NULL, 102),
(6, 'Deniz', 'Çelik', 'deniz.celik@example.com', '5551112233', NULL);
IS NULL Kullanımı
Email adresi NULL olan çalışanları listelemek:
SELECT CalisanID, Ad, Soyad, Email
FROM Calisanlar
WHERE Email IS NULL;
Bu sorgu, Mehmet Demir ve Elif Aksoy'un kayıtlarını döndürecektir.
IS NOT NULL Kullanımı
Telefon numarası tanımlanmış (NULL olmayan) çalışanları listelemek:
SELECT CalisanID, Ad, Soyad, Telefon
FROM Calisanlar
WHERE Telefon IS NOT NULL;
Bu sorgu, Ayşe Yılmaz, Mehmet Demir, Ali Can ve Deniz Çelik'in kayıtlarını döndürecektir.
COALESCE Kullanımı
Email adresi NULL olan çalışanlar için 'Email Yok' yazısını göstermek:
SELECT
    CalisanID,
    Ad,
    Soyad,
    COALESCE(Email, 'Email Yok') AS GosterilenEmail
FROM Calisanlar;
Bu sorgu, Mehmet Demir ve Elif Aksoy'un Email sütununda 'Email Yok' ifadesini gösterecektir.
Birden Fazla NULL Kontrolü
Hem Email hem de Telefon bilgisi NULL olan çalışanları bulmak:
SELECT CalisanID, Ad, Soyad, Email, Telefon
FROM Calisanlar
WHERE Email IS NULL AND Telefon IS NULL;
Bu sorgu, Elif Aksoy'un kaydını döndürecektir.
NULL ve Sıfır/Boş String Farkı: NULL, matematiksel sıfırdan (0) veya boş karakter dizisinden ('') farklıdır. Bu değerler birer veri değeriyken, NULL bir değerin yokluğunu ifade eder. Karşılaştırmalarda bu farka dikkat edilmelidir.
Karşılaştırma Operatörleri: =, <>, != gibi standart karşılaştırma operatörlerini NULL değerlerle kullanmaktan kaçının. Bu operatörler NULL ile karşılaştırıldığında her zaman UNKNOWN döndürür ve beklenen sonucu vermez. Daima IS NULL veya IS NOT NULL kullanın.
Toplama Fonksiyonları ve NULL: COUNT(), SUM(), AVG() gibi toplama (aggregate) fonksiyonları genellikle NULL değerleri hesaplamalarına dahil etmez. Örneğin, AVG(SutunAdı), SutunAdı içindeki NULL değerleri göz ardı ederek ortalamayı hesaplar. Ancak COUNT(*), NULL değerleri de içeren tüm satırları sayar.
NOT IN ve NULL: NOT IN operatörü ile NULL değerleri kullanırken dikkatli olun. Eğer NOT IN listesinde bir NULL değer varsa, sorgu beklenmedik şekilde hiçbir sonuç döndürmeyebilir çünkü NULL ile yapılan herhangi bir karşılaştırma UNKNOWN sonucunu verir. Örneğin, SELECT * FROM Tablo WHERE Deger NOT IN (1, 2, NULL); sorgusu UNKNOWN nedeniyle sorunlara yol açabilir.
Veritabanı Tasarımı: Tablo oluştururken bir sütunun NULL değer kabul edip etmeyeceğini NULL veya NOT NULL kısıtlamaları ile belirleyebilirsiniz. NOT NULL kısıtlaması, o sütunun her zaman bir değer içermesini sağlar ve veri bütünlüğünü artırır.
                PHP dilinde hata ve istisna yönetimi, uygulamaların beklenmedik durumlarla nasıl başa çıktığını belirleyen kritik bir konudur. Etkili hata yönetimi, uygulamanın kararlılığını artırır, kullanıcı deneyimini iyileştirir ve hata ayıklama süreçlerini önemli ölçüde kolaylaştırır. PHP, hem geleneksel hata işleme yaklaşımları hem de modern istisna mekanizmaları sunarak geliştiricilere esneklik sağlar.
PHP'de hata ve istisna yönetimi, genellikle iki ana mekanizma etrafında şekillenir:
İstisna Yönetimi: Potansiyel olarak hata oluşturabilecek kod bloklarını sarmalamak ve bu bloklarda fırlatılan istisnaları yakalamak için try...catch...finally yapıları kullanılır. Özel durumları belirtmek için throw ifadesiyle istisnalar fırlatılabilir.
Geleneksel Hata İşleme: PHP'nin eski sürümünden gelen ve E_NOTICE, E_WARNING gibi hata seviyelerini içeren hatalar için set_error_handler() fonksiyonu ile özel hata işleyicileri tanımlanabilir.
PHP'nin hata ve istisna yönetimi yapıları aşağıdaki bileşenlerden oluşur:
try Bloğu: İstisna fırlatma potansiyeli olan kodun yerleştirildiği bloktur. Bu blok içindeki herhangi bir istisna fırlatıldığında, normal akış durur ve uygun catch bloğu aranır.
catch Bloğu: Bir try bloğu içinde fırlatılan belirli bir türdeki istisnayı yakalamak için kullanılır. catch bloğu, yakalanan istisnayı parametre olarak alır ve bu istisna üzerinde işlem yapılmasına olanak tanır. PHP 7'den itibaren birden fazla catch bloğu tanımlanabilir ve bir catch bloğu birden fazla istisna türünü | operatörü ile yakalayabilir.
finally Bloğu (PHP 5.5+): İster bir istisna fırlatılsın ister fırlatılmasın, try ve catch bloklarından sonra her durumda çalıştırılması garanti edilen kod bloğudur. Bu genellikle kaynakların serbest bırakılması veya temizlik işlemleri için kullanılır.
throw İfadesi: Manuel olarak bir istisna nesnesi fırlatmak için kullanılır. Genellikle bir koşul sağlanmadığında veya beklenmedik bir durum oluştuğunda programın akışını kontrol altına almak için tercih edilir.
set_error_handler(callable $handler, int $error_types = E_ALL | E_STRICT): PHP'nin varsayılan hata işleyicisini özel bir fonksiyonla değiştirmeye yarar. Bu fonksiyon, E_ERROR dışındaki tüm hata türlerini (E_WARNING, E_NOTICE vb.) yakalayabilir. Fonksiyon, hata kodu, hata mesajı, dosya adı ve satır numarası gibi parametreler alır.
restore_error_handler(): Daha önce set_error_handler() ile değiştirilmiş olan hata işleyiciyi PHP'nin varsayılan işleyicisine geri döndürür.
error_reporting(int $level): Hangi hata seviyelerinin raporlanacağını belirler. Geliştirme ortamında genellikle tüm hatalar raporlanırken (E_ALL), üretim ortamında daha düşük seviyeli hatalar gizlenir.
display_errors ve log_errors: PHP'nin php.ini dosyasında veya çalışma zamanında ayarlanabilen bu yönergeler, hataların tarayıcı çıktısında gösterilip gösterilmeyeceğini ve hata günlüklerine yazılıp yazılmayacağını kontrol eder.
Aşağıdaki örnekler, PHP'de hata ve istisna yönetiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
1. Temel try...catch Kullanımı
"; // Çalışır
    echo bolmeIslemi(10, 0) . "
"; // İstisna fırlatır
    echo "Bu satır çalışmayacak.
";
} catch (Exception $e) {
    echo "Hata yakalandı: " . $e->getMessage() . "
";
}
?>2. Özel İstisna Sınıfı Tanımlama ve Kullanımı
getMessage() . " (Kod: " . $this->getCode() . ")";
    }
}
function veritabaninaBaglan() {
    // Bağlantı denemesi yapıldığı varsayılsın
    $basarili = false; // Bağlantının başarısız olduğunu simüle edelim
    if (!$basarili) {
        throw new VeritabaniBaglantiHatasi("Veritabanı sunucusuna ulaşılamıyor.");
    }
    return "Bağlantı başarılı!";
}
try {
    echo veritabaninaBaglan() . "
";
} catch (VeritabaniBaglantiHatasi $e) {
    echo $e->hataMesaji() . "
";
} catch (Exception $e) { // Genel istisnaları yakalamak için
    echo "Genel bir hata oluştu: " . $e->getMessage() . "
";
}
?>3. finally Bloğu Kullanımı
";
        // Dosya okuma işlemleri...
    } catch (Exception $e) {
        echo "Hata: " . $e->getMessage() . "
";
    } finally {
        if ($dosyaKaynagi) {
            fclose($dosyaKaynagi);
            echo "Dosya kapatıldı.
";
        } else {
            echo "Dosya zaten açık değildi veya açma başarısız oldu.
";
        }
    }
}
dosyaIslemi("olmayan_dosya.txt");
dosyaIslemi("varolan_dosya.txt"); // Bu dosyayı manuel olarak oluşturmanız gerekebilir
?>4. set_error_handler() ile Geleneksel Hata Yakalama
Özel Hata: [$errno] $errstr - $errfile:$errline
";
    // Hata günlüğüne yazma
    error_log("Özel Hata [$errno]: $errstr - $errfile:$errline");
    // TRUE döndürmek, PHP'nin dahili hata işleyicisinin çalışmasını engeller.
    return true;
}
// Özel hata işleyiciyi ayarla
set_error_handler("ozelHataIsleyici");
// E_WARNING seviyesinde bir hata oluştur
echo $tanimsizDegisken; // E_NOTICE veya E_WARNING oluşturabilir
// E_NOTICE seviyesinde bir hata oluştur
$dizi = [];
echo $dizi[0];
// Özel hata işleyiciyi eski haline getir
restore_error_handler();
// Bu hata artık varsayılan işleyici tarafından ele alınır (veya gizlenir)
trigger_error("Bu hata artık eski işleyiciye döner.", E_USER_WARNING);
?>Throwable Arayüzü (PHP 7+): PHP 7'den itibaren hem Error (dahili PHP hataları) hem de Exception (kullanıcı tanımlı ve standart istisnalar) sınıfları Throwable arayüzünü uygular. Bu sayede catch (Throwable $e) kullanarak tüm yakalanabilir hataları ve istisnaları tek bir blokta ele alabilirsiniz.
Hata Seviyeleri: PHP, E_ERROR, E_WARNING, E_NOTICE, E_PARSE gibi birçok hata seviyesi tanımlar. Uygulamanızın davranışını ve hata raporlama düzeyini bu seviyeleri kullanarak kontrol etmek önemlidir.
Üretim Ortamında Hata Gösterimi: Üretim ortamında display_errors ayarının Off (kapalı) olduğundan emin olun. Hataların doğrudan kullanıcıya gösterilmesi güvenlik zafiyetlerine yol açabilir. Bunun yerine, log_errors ayarını On (açık) yaparak hataları güvenli bir günlük dosyasına yazdırın.
Hata Günlükleme: error_log() fonksiyonu, hataları PHP'nin yapılandırılmış günlük dosyasına veya belirtilen bir hedefe yazmak için kullanılabilir. Özel hata işleyicileriniz içinde bu fonksiyonu kullanarak detaylı hata kayıtları tutmanız önerilir.
İstisna Hiyerarşisi: Birden fazla catch bloğu kullanırken, istisnaları en spesifikten en genele doğru sıralayın. Örneğin, özel bir istisna sınıfını (VeritabaniBaglantiHatasi) genel bir Exception sınıfından önce yakalayın.
Boş catch Bloklarından Kaçının: Bir istisnayı yakalayıp hiçbir işlem yapmamak (boş catch bloğu), hatanın gözden kaçmasına ve uygulamanın beklenmedik şekillerde davranmasına neden olabilir. Her zaman yakalanan istisnaları günlüğe kaydedin veya uygun bir şekilde ele alın.
                Hepimizin hayatında en az bir kere duyduğu, belki de kendi kendine sorduğu bir soru var: "Ben matematikte doğuştan kötüyüm, değil mi?" Bu cümle, genellikle matematiğe karşı hissedilen bir çaresizliğin, bir kabullenişin ifadesidir. Ancak bir SEO yazarı ve gazeteci olarak, bu konuda edindiğim bilgilerle size bambaşka bir pencere açmak istiyorum. Gerçekten de bazı insanlar matematikte doğuştan mı başarısızdır, yoksa bu sadece yaygın bir yanılsama mı?
Gelin, bu konuyu bilimsel veriler, uzman görüşleri ve psikolojinin ışığında derinlemesine inceleyelim. Çünkü matematik, sandığımızdan çok daha esnek, öğrenilebilir ve herkesin erişebileceği bir alandır.
Toplumda sıkça karşılaştığımız bir inanç vardır: Bazı insanların "matematik beyni" ile doğduğu, bazılarının ise bu yetenekten yoksun olduğu. Bu durum, genellikle çocukluktan itibaren "sayısalcı" veya "sözelci" gibi etiketlemelerle pekiştirilir. Ancak modern bilim, bu katı ayrımın pek de doğru olmadığını gösteriyor. Beynimiz, düşündüğümüzden çok daha esnektir ve hayat boyu öğrenmeye açıktır.
Araştırmalar, matematiğin sadece sol beynin işi olmadığını, aslında beynin birçok farklı bölgesinin etkileşim içinde çalıştığını ortaya koyuyor. Mantık, problem çözme, uzamsal düşünme, hatta yaratıcılık bile matematiksel süreçlerde rol oynar. Yani, "matematik beyni" diye tekil bir yapıdan bahsetmek yerine, matematiksel düşünmenin karmaşık ve çok yönlü bir beceri olduğunu anlamak daha doğru olacaktır.
Stanford Üniversitesi'nden psikolog Carol Dweck'in çalışmaları, "zihin yapısı" kavramının öğrenme üzerindeki etkisini çarpıcı bir şekilde ortaya koymuştur. Dweck, iki ana zihin yapısından bahseder:
Sabit Zihin Yapısı (Fixed Mindset): Bireylerin yeteneklerinin doğuştan geldiğine ve değiştirilemez olduğuna inandığı durumdur. "Matematikte kötüyüm, çünkü bu benim kaderim" düşüncesi bu kategoriye girer. Bu inanca sahip kişiler, zorluklarla karşılaştıklarında kolayca pes etme eğilimindedirler.
Büyüme Zihin Yapısı (Growth Mindset): Bireylerin yeteneklerinin çaba, pratik ve doğru stratejilerle geliştirilebileceğine inandığı durumdur. "Matematikte şu an zorlanıyorum, ama daha çok çalışarak ve farklı yöntemler deneyerek öğrenebilirim" düşüncesi bu zihin yapısının temelidir. Bu kişiler, hataları öğrenme fırsatı olarak görür ve azimle yola devam ederler.
Matematikteki başarısızlığın büyük bir kısmı, aslında sabit zihin yapısının bir sonucudur. Eğer kendimize "yapamam" dersek, beynimiz de bu inancı pekiştirir ve gerçekten yapamayız. Oysa büyüme zihin yapısını benimsemek, matematiksel potansiyelimizi ortaya çıkarmanın ilk ve en önemli adımıdır.
Matematik öğrenme deneyimimiz, büyük ölçüde bize nasıl öğretildiğiyle de şekillenir. Geleneksel ezbere dayalı, formül odaklı öğretim yöntemleri, birçok öğrencinin matematiğin soyut dünyasında kaybolmasına neden olabilir. Oysa modern eğitim yaklaşımları, matematiği daha somut, anlamlı ve etkileşimli hale getirmeyi hedefler.
Öğretmenlerin sabrı, konuyu farklı açılardan açıklama yeteneği ve öğrencilerin bireysel öğrenme stillerine dikkat etmesi, matematik başarısı üzerinde kritik bir etkiye sahiptir. Bazı öğrenciler görsel öğrenirken, bazıları işitsel, bazıları ise yaparak-yaşayarak öğrenir. Tek tip bir öğretim metodunun herkes için geçerli olmadığını anlamak, matematik eğitiminde devrim niteliğinde bir adımdır.
Matematik kaygısı, birçok insanın matematiksel görevler karşısında hissettiği gerginlik, endişe ve korku durumudur. Bu kaygı, sınav anında zihnin donmasına, basit hatalar yapmaya ve hatta matematiksel kavramları anlama yeteneğinin körelmesine neden olabilir. Matematik kaygısı, genellikle geçmişteki olumsuz deneyimler, öğretmenin veya ebeveynlerin olumsuz yaklaşımları veya toplumsal baskılar sonucunda ortaya çıkar.
İlginçtir ki, matematik kaygısı yaşayan bireylerin çoğu, aslında matematiksel yetenekten yoksun değildir. Aksine, zeki ve potansiyeli yüksek öğrencilerde bile görülebilir. Kaygı, bilişsel kaynakları tüketerek problem çözme becerisini engeller. Bu durum, "matematikte kötüyüm" algısını pekiştiren bir kısır döngü yaratır.
Ebeveynlerin veya çevrenin matematiğe karşı tutumu, çocukların matematiğe bakış açısını derinden etkiler. "Ben de matematikte iyi değildim zaten" gibi ifadeler, farkında olmadan çocuklara matematiğin zor ve başa çıkılamaz bir ders olduğu mesajını verir. Bu tür olumsuz mesajlar, çocukların matematiğe karşı önyargılı yaklaşmasına ve daha başlamadan pes etmesine neden olabilir.
Araştırmalar, ebeveynlerin çocuklarının matematik ödevlerine yardımcı olurken gösterdikleri kaygının bile çocuklara geçebileceğini gösteriyor. Destekleyici, olumlu ve sabırlı bir çevre, matematik öğreniminde mucizeler yaratabilir.
Yukarıda bahsettiğimiz tüm faktörler, matematiksel başarısızlığın büyük bir kısmını açıklasa da, çok nadir de olsa gerçek bir öğrenme güçlüğü olan "diskalkuli"den bahsetmek gerekir. Diskaluli, matematiksel kavramları anlama, sayıları işleme ve aritmetik işlemleri yapmada ciddi ve kalıcı zorluklarla karakterize edilen nörolojik bir durumdur.
Diskaluli tanısı konmuş bireyler, temel sayı hissi (number sense) ve matematiksel muhakeme yeteneğinde belirgin eksiklikler yaşarlar. Ancak unutulmamalıdır ki, diskalkuli matematiksel zorluk yaşayan nüfusun çok küçük bir yüzdesini oluşturur. Matematikte zorlanan çoğu kişi, diskalkuli değil, yukarıda saydığımız öğrenme, zihin yapısı veya kaygı temelli sorunlar yaşamaktadır. Doğru destek ve stratejilerle bu zorlukların üstesinden gelmek mümkündür.
Matematik de bir dil öğrenmek veya bir enstrüman çalmak gibidir. Düzenli pratik, tekrar ve sabır gerektirir. İlk başta zor gelen kavramlar, üzerine gidildikçe, farklı örneklerle tekrarlandıkça zihnimizde yer edinir ve kalıcı hale gelir.
Beynimizdeki sinir ağları, yeni bilgiler öğrendikçe güçlenir ve yeni bağlantılar kurar. Bu duruma nöroplastisite denir. Yani, matematiksel beceriler, tıpkı bir kas gibi, kullanıldıkça ve zorlandıkça gelişir. Yanlış yapmak, öğrenme sürecinin doğal bir parçasıdır. Önemli olan, yanlışlardan ders çıkarıp denemeye devam etmektir.
Eğer siz de kendinizi "matematikte kötüyüm" diyenlerden biri olarak görüyorsanız, umutsuzluğa kapılmayın. İşte size birkaç öneri:
Zihin Yapınızı Değiştirin: Sabit zihin yapısından büyüme zihin yapısına geçmeye çalışın. "Yapamam" yerine "Henüz yapamıyorum, ama öğrenebilirim" deyin.
Küçük Adımlarla Başlayın: Kendinizi bunaltacak büyük hedefler koymak yerine, temel kavramları anlamaya odaklanın. Küçük başarılar, motivasyonunuzu artıracaktır.
Yardım Almaktan Çekinmeyin: Anlamadığınız bir konu olduğunda öğretmenlerinizden, arkadaşlarınızdan veya özel ders verenlerden yardım isteyin. Utanmak yerine, meraklı olun.
Farklı Kaynakları Deneyin: Sadece ders kitabıyla sınırlı kalmayın. İnternetteki eğitim videoları, interaktif uygulamalar veya farklı anlatım tarzına sahip kitaplar size yeni kapılar açabilir.
Matematikle Aranızdaki Kaygıyı Azaltın: Meditasyon, derin nefes alma egzersizleri gibi tekniklerle sınav kaygınızı yönetmeyi öğrenin. Başarıya giden yolda sakin bir zihin şarttır.
Pratik Yapın, Tekrar Edin: Düzenli olarak problem çözün. Başarısız olsanız bile, bu bir öğrenme fırsatıdır. Yanlışlarınızdan ders çıkarın.
Matematiğin Günlük Hayattaki Yerini Görün: Matematik sadece formüllerden ibaret değildir. Mutfakta, alışverişte, spor yaparken veya oyun oynarken bile matematikle iç içeyiz. Bu bağlantıları görmek, matematiği daha anlamlı hale getirecektir.
Sonuç olarak, "matematikte doğuştan kötü olmak" kavramı, modern bilimin ve psikolojinin ışığında geçerliliğini büyük ölçüde yitirmiştir. Yeteneklerimiz sabit değildir; zihin yapımız, aldığımız eğitim, yaşadığımız kaygılar ve çevremizin etkisiyle şekillenir. Matematik, tıpkı diğer tüm beceriler gibi, çaba, doğru stratejiler ve inançla geliştirilebilir bir alandır. Kendinize bu şansı verin ve matematiğin büyülü dünyasını yeniden keşfedin!
                JavaScript'te Setler, benzersiz değerlerden oluşan bir koleksiyonu depolamak için kullanılan özel bir nesne türüdür.
Bu veri yapısı, tekrar eden öğelerin otomatik olarak elenmesini sağlayarak veri yönetimi ve manipülasyonunda önemli avantajlar sunar.
Bu makale, JavaScript Setlerinin temel kullanımını, sözdizimini ve pratik uygulamalarını detaylı bir şekilde açıklayacaktır.
Bir Set oluşturmak için new Set() kurucusu kullanılır.
Değerler, Set'in kurucusuna bir iterable (örneğin bir dizi) olarak geçirilebilir veya daha sonra add() metodu ile eklenebilir.
// Boş bir Set oluşturma
const mySet = new Set();
// Başlangıç değerleri ile Set oluşturma
const initialSet = new Set([1, 2, 3, 2, 4]); // initialSet: {1, 2, 3, 4}
// Metotlar
mySet.add(value);      // Bir değer ekler
mySet.delete(value);   // Bir değeri siler
mySet.has(value);      // Bir değerin varlığını kontrol eder
mySet.clear();         // Set'teki tüm öğeleri siler
mySet.size;            // Set'teki öğe sayısını döndürürnew Set([iterable]): Yeni bir Set nesnesi oluşturur. İsteğe bağlı olarak, iterable bir nesne (örneğin bir dizi) alabilir. Bu iterable içindeki tüm öğeler Set'e eklenir. Tekrar eden değerler otomatik olarak göz ardı edilir.
Set.prototype.add(value): Set'e yeni bir değer ekler. Eğer değer zaten Set'te mevcutsa, Set değişmez. Zincirleme çağrılara izin vermek için Set nesnesini döndürür.
Set.prototype.delete(value): Set'ten belirli bir değeri siler. Eğer değer Set'te mevcutsa true, aksi takdirde false döndürür.
Set.prototype.has(value): Belirli bir değerin Set'te olup olmadığını kontrol eder. Varsa true, yoksa false döndürür.
Set.prototype.clear(): Set'teki tüm öğeleri siler ve Set'i boşaltır.
Set.prototype.size: Set'teki benzersiz öğelerin sayısını döndüren bir erişimci özelliğidir.
Set.prototype.forEach(callbackFn[, thisArg]): Set'teki her öğe için bir callback fonksiyonu yürütür. Dizilerdeki forEach metoduna benzer.
Set.prototype.values(), Set.prototype.keys(), Set.prototype.entries(): Set'teki değerleri, anahtarları (Set'lerde anahtarlar ve değerler aynıdır) veya anahtar/değer çiftlerini ([value, value] formatında) içeren yeni bir Iterator nesnesi döndürür.
Aşağıdaki örnekler, JavaScript Setlerinin çeşitli kullanım senaryolarını göstermektedir.
Bir dizideki yinelenen öğeleri kaldırmak ve yalnızca benzersiz değerleri elde etmek için Setleri kullanmak oldukça etkilidir.
const numbers = [1, 2, 3, 4, 2, 1, 5, 6, 3];
const uniqueNumbers = new Set(numbers);
console.log(uniqueNumbers); // Set(6) {1, 2, 3, 4, 5, 6}
// Set'i tekrar bir diziye dönüştürme
const uniqueNumbersArray = [...uniqueNumbers];
console.log(uniqueNumbersArray); // [1, 2, 3, 4, 5, 6]Bir öğenin bir koleksiyonda olup olmadığını hızlıca kontrol etmek için has() metodunu kullanabilirsiniz.
const fruits = new Set(['elma', 'armut', 'muz']);
console.log(fruits.has('elma'));   // true
console.log(fruits.has('çilek'));  // false
fruits.add('çilek');
console.log(fruits.has('çilek'));  // trueSet öğeleri üzerinde döngü yapmak için forEach() metodunu veya for...of döngüsünü kullanabilirsiniz.
const colors = new Set(['kırmızı', 'mavi', 'yeşil']);
// forEach ile iterasyon
colors.forEach(color => {
    console.log(color);
});
// Çıktı:
// kırmızı
// mavi
// yeşil
// for...of ile iterasyon
for (const color of colors) {
    console.log(color);
}
// Çıktı:
// kırmızı
// mavi
// yeşilDeğer Karşılaştırması: Setler, değerleri karşılaştırırken aynı algoritmayı kullanır. Bu, NaN değerlerinin Set içinde benzersiz olarak ele alındığı anlamına gelir (NaN === NaN false olmasına rağmen, Set içinde sadece bir adet NaN bulunabilir). Obje referansları için, farklı referanslara sahip aynı içeriğe sahip objeler farklı kabul edilir.
Sırasız Yapı: Setler, öğeleri eklenme sırasına göre depolasa da, Setin birincil amacı benzersiz öğeleri tutmaktır, belirli bir sırayı garanti etmek değildir. Bazı durumlarda iterasyon sırası ekleme sırasına denk gelebilir, ancak buna güvenilmemelidir.
Performans: Bir öğenin Set'te varlığını kontrol etmek (has() metodu) genellikle O(1) zaman karmaşıklığına sahiptir, bu da büyük veri kümeleri için dizilerdeki aramalara göre daha verimli olabilir.
Zayıf Referanslar: Eğer objeler için zayıf referanslara ihtiyacınız varsa (yani objeye başka referans kalmadığında otomatik olarak belleğin serbest bırakılmasını istiyorsanız), WeakSet kullanmanız gerekebilir. Ancak WeakSet sadece objeleri depolayabilir ve iterable değildir.
Anahtar-Değer Çiftleri İçin Setler: Eğer benzersiz anahtar-değer çiftleri depolamanız gerekiyorsa, Map nesnesi daha uygun bir seçenek olabilir.
                Veritabanı yönetim sistemlerinde (DBMS) mevcut kayıtların üzerinde değişiklik yapmak, veri bütünlüğünü sağlamak ve dinamik uygulamalar geliştirmek için temel bir gerekliliktir. SQL (Yapısal Sorgu Dili) bu ihtiyacı karşılamak üzere güçlü bir komut olan UPDATE ifadesini sunar. Bu makale, SQL UPDATE komutunun sözdizimini, kullanımını ve pratik örneklerini detaylı bir şekilde ele alarak, veritabanlarınızdaki bilgileri güvenli ve etkili bir şekilde nasıl güncelleyeceğinizi açıklamaktadır.
SQL UPDATE komutunun temel yapısı aşağıdaki gibidir:
UPDATE tablo_adı
SET sütun1 = değer1, sütun2 = değer2, ...
WHERE koşul;Yukarıdaki sözdizimi, belirli bir tablodaki bir veya daha fazla satırın bir veya daha fazla sütunundaki verileri değiştirmek için kullanılır.
UPDATE tablo_adı: Güncellemek istediğiniz tablonun adını belirtir. Bu kısım, işlemin hangi veritabanı nesnesi üzerinde yapılacağını tanımlar.
SET sütun1 = değer1, sütun2 = değer2, ...: Güncellenecek sütunları ve bu sütunlara atanacak yeni değerleri belirtir. Birden fazla sütunu güncellemek için sütun-değer çiftleri virgüllerle ayrılır. Atanan değerler sabit bir değer, başka bir sütunun değeri, bir ifade veya bir alt sorgunun sonucu olabilir.
WHERE koşul: Bu anahtar kelime ve ardından gelen koşul, hangi satırların güncelleneceğini belirler. Yalnızca belirtilen koşulu sağlayan satırlar güncellenir. Eğer WHERE koşulu kullanılmazsa, tablodaki tüm satırlar SET ifadesinde belirtilen değerlerle güncellenir. Bu, genellikle istenmeyen ve dikkatli olunması gereken bir durumdur.
Aşağıdaki örnekler, UPDATE komutunun farklı senaryolarda nasıl kullanılabileceğini göstermektedir. Örneklerde Müşteriler ve Ürünler adında iki tablo varsayılmaktadır.
Belirli bir müşteri ID'sine sahip müşterinin e-posta adresini güncelleyelim:
UPDATE Müşteriler
SET E_posta = 'yeni.eposta@example.com'
WHERE MüşteriID = 101;Bu sorgu, MüşteriID'si 101 olan kaydın E_posta sütununu yeni.eposta@example.com olarak değiştirir.
Belirli bir ürünün fiyatını ve stok miktarını aynı anda güncelleyelim:
UPDATE Ürünler
SET Fiyat = 29.99, StokMiktarı = 150
WHERE ÜrünID = 205;ÜrünID'si 205 olan ürünün hem Fiyat hem de StokMiktarı sütunları güncellenir.
Belirli bir kategorideki tüm ürünlerin fiyatını %10 artıralım:
UPDATE Ürünler
SET Fiyat = Fiyat * 1.10
WHERE Kategori = 'Elektronik';Bu örnek, mevcut Fiyat değerini kullanarak yeni bir değer hesaplar ve atar.
Eğer WHERE koşulu kullanılmazsa, tablodaki tüm satırlar güncellenir. Örneğin, tüm ürünlerin durumunu 'Pasif' olarak ayarlamak için:
UPDATE Ürünler
SET Durum = 'Pasif';Bu sorgu, Ürünler tablosundaki her ürünün Durum sütununu 'Pasif' olarak ayarlar. Bu tür bir işlem yapmadan önce daima veritabanı yedeği almanız ve işlemin etkilerini tam olarak anladığınızdan emin olmanız şiddetle tavsiye edilir.
WHERE koşulunun gücü ve tehlikesi: WHERE koşulu olmadan yapılan bir UPDATE işlemi, tablonuzdaki tüm verileri geri dönülemez bir şekilde değiştirebilir. Her zaman önce SELECT sorgusu ile güncellenecek satırları kontrol edin.
TRANSACTION kullanımı: Büyük veya kritik UPDATE işlemleri yaparken BEGIN TRANSACTION, COMMIT ve ROLLBACK komutlarını kullanmak iyi bir uygulamadır. Bu, bir hata durumunda değişiklikleri geri almanıza olanak tanır.
Yedekleme: Herhangi bir büyük veri değişikliği yapmadan önce daima veritabanınızın yedeğini alın. Bu, beklenmedik sorunlar karşısında verilerinizi kurtarmanızı sağlar.
Performans: Çok büyük tablolarda UPDATE işlemleri performans sorunlarına yol açabilir. İndekslerin doğru kullanılması ve işlem büyüklüğünün optimize edilmesi önemlidir.
SQL Injection: Kullanıcı girdileri ile dinamik UPDATE sorguları oluştururken SQL Injection saldırılarına karşı dikkatli olun. Güvenli parametreli sorgular (prepared statements) kullanmak bu tür riskleri azaltır.
                Python programlama dilinde listeler, birden fazla öğeyi tek bir değişken altında depolamak için kullanılan temel ve çok yönlü veri yapılarından biridir. Sıralı, değiştirilebilir (mutable) ve farklı veri tiplerindeki öğeleri barındırabilen koleksiyonlardır. Veri yönetimi, algoritma geliştirme ve birçok programlama görevinde kritik bir rol oynarlar. Bu kılavuz, Python listelerinin oluşturulmasından karmaşık manipülasyonlarına kadar tüm yönlerini adım adım ele alacaktır.
Python'da bir liste, köşeli parantezler [] içine virgülle ayrılmış öğeler yerleştirilerek oluşturulur.
liste_adi = [eleman1, eleman2, eleman3, ...]liste_adi: Oluşturulan listeyi referans alan değişkendir. Geçerli bir Python tanımlayıcısı olmalıdır.
=: Atama operatörüdür. Sağdaki liste değerini soldaki değişkene atar.
[]: Köşeli parantezler, bir liste veri yapısının başlangıcını ve sonunu işaret eder. Python yorumlayıcısı, bu parantezlerin içindeki öğeleri bir liste olarak tanır.
eleman1, eleman2, eleman3, ...: Listede saklanacak öğelerdir. Bu öğeler, tam sayılar, ondalık sayılar, dizeler, boolean değerler, hatta başka listeler veya özel nesneler dahil olmak üzere herhangi bir Python veri tipinde olabilir. Öğeler birbirlerinden virgül , ile ayrılır.
Listeler sıralıdır, yani öğelerin eklenme sırası korunur ve bir dizin (index) numarası ile erişilebilirler. İlk öğenin dizini 0'dır. Ayrıca, listeler değiştirilebilirdir, yani oluşturulduktan sonra öğeleri eklenebilir, çıkarılabilir veya güncellenebilir.
Aşağıdaki örnekler, Python listelerinin temel kullanım senaryolarını göstermektedir.
Boş bir liste veya farklı veri tiplerini içeren bir liste oluşturabilirsiniz.
# Boş bir liste oluşturma
bos_liste = []
print(f"Boş Liste: {bos_liste}")
# Tam sayılar içeren bir liste
sayilar = [1, 2, 3, 4, 5]
print(f"Sayılar Listesi: {sayilar}")
# Dizeler içeren bir liste
meyveler = ["elma", "armut", "kiraz"]
print(f"Meyveler Listesi: {meyveler}")
# Farklı veri tiplerini içeren bir liste
karisik_liste = [10, "Python", True, 3.14]
print(f"Karışık Liste: {karisik_liste}")
# İç içe liste (nested list)
ic_ice_liste = [[1, 2], ["a", "b"]]
print(f"İç İçe Liste: {ic_ice_liste}")Listelerdeki öğelere dizin numaraları (index) kullanılarak erişilir. Dizinler 0'dan başlar. Negatif dizinler listenin sonundan itibaren saymaya başlar (-1 son öğeyi temsil eder).
my_list = ["a", "b", "c", "d", "e"]
# İlk öğeye erişim
print(f"İlk öğe: {my_list[0]}") # Çıktı: a
# Üçüncü öğeye erişim
print(f"Üçüncü öğe: {my_list[2]}") # Çıktı: c
# Son öğeye erişim (negatif dizin)
print(f"Son öğe: {my_list[-1]}") # Çıktı: e
# Sondan ikinci öğeye erişim
print(f"Sondan ikinci öğe: {my_list[-2]}") # Çıktı: dListeler değiştirilebilir olduğu için, belirli bir dizindeki öğeyi güncelleyebilirsiniz.
sayilar = [10, 20, 30, 40]
print(f"Orijinal liste: {sayilar}")
# İlk öğeyi değiştirme
sayilar[0] = 5
print(f"Değiştirilen ilk öğe sonrası: {sayilar}") # Çıktı: [5, 20, 30, 40]
# Son öğeyi değiştirme
sayilar[-1] = 50
print(f"Değiştirilen son öğe sonrası: {sayilar}") # Çıktı: [5, 20, 30, 50]append() metodu listenin sonuna, insert() metodu ise belirtilen bir dizine öğe ekler.
meyveler = ["elma", "armut"]
# listenin sonuna öğe ekleme
meyveler.append("muz")
print(f"Append sonrası: {meyveler}") # Çıktı: ['elma', 'armut', 'muz']
# Belirli bir dizine öğe ekleme (dizin 1'e 'kiraz' ekle)
meyveler.insert(1, "kiraz")
print(f"Insert sonrası: {meyveler}") # Çıktı: ['elma', 'kiraz', 'armut', 'muz']remove() metodu belirtilen değeri, pop() metodu belirtilen dizindeki öğeyi (veya son öğeyi), del anahtar kelimesi ise belirtilen dizindeki öğeyi veya dilimi siler.
renkler = ["kırmızı", "yeşil", "mavi", "sarı"]
# Değere göre silme
renkler.remove("yeşil")
print(f"Remove 'yeşil' sonrası: {renkler}") # Çıktı: ['kırmızı', 'mavi', 'sarı']
# Dizin 1'deki öğeyi silme (pop varsayılan olarak son öğeyi siler)
silinen_renk = renkler.pop(1)
print(f"Pop sonrası: {renkler}, Silinen: {silinen_renk}") # Çıktı: ['kırmızı', 'sarı'], Silinen: mavi
# 'del' anahtar kelimesi ile dizin 0'daki öğeyi silme
del renkler[0]
print(f"Del sonrası: {renkler}") # Çıktı: ['sarı']
# Tüm listeyi silme
# del renkler
# print(renkler) # Hata verecektir, çünkü liste artık mevcut değil.
# Listeyi temizleme (içindeki tüm öğeleri siler, liste objesi kalır)
sayilar = [1, 2, 3]
sayilar.clear()
print(f"Clear sonrası: {sayilar}") # Çıktı: []Listenin bir bölümünü (dilimini) almak için dilimleme işlemi kullanılır. Sözdizimi liste[baslangic:bitis:adim] şeklindedir.
alfabe = ["a", "b", "c", "d", "e", "f", "g"]
# İlk üç öğeyi al
print(f"İlk üç: {alfabe[0:3]}") # Çıktı: ['a', 'b', 'c']
print(f"İlk üç (kısa): {alfabe[:3]}") # Çıktı: ['a', 'b', 'c']
# İkinci dizinden sona kadar
print(f"İkinci dizinden sona: {alfabe[1:]}") # Çıktı: ['b', 'c', 'd', 'e', 'f', 'g']
# Üçüncü dizinden beşinci dizine kadar (beşinci dahil değil)
print(f"Üçüncüden beşe: {alfabe[2:5]}") # Çıktı: ['c', 'd', 'e']
# Tüm listeyi kopyalama
kopyalanmis_alfabe = alfabe[:]
print(f"Kopyalanmış: {kopyalanmis_alfabe}") # Çıktı: ['a', 'b', 'c', 'd', 'e', 'f', 'g']
# Her ikinci öğeyi al
print(f"Her ikinci: {alfabe[::2]}") # Çıktı: ['a', 'c', 'e', 'g']
# Listeyi ters çevir
print(f"Ters çevrilmiş: {alfabe[::-1]}") # Çıktı: ['g', 'f', 'e', 'd', 'c', 'b', 'a']Listeler üzerinde çeşitli temel operasyonlar gerçekleştirebilirsiniz.
liste1 = [1, 2, 3]
liste2 = [4, 5, 6]
# Listeleri birleştirme (concatenation)
birlesik_liste = liste1 + liste2
print(f"Birleşik liste: {birlesik_liste}") # Çıktı: [1, 2, 3, 4, 5, 6]
# Bir listeyi tekrarlama
tekrarlanan_liste = liste1 * 3
print(f"Tekrarlanan liste: {tekrarlanan_liste}") # Çıktı: [1, 2, 3, 1, 2, 3, 1, 2, 3]
# Liste uzunluğunu bulma
print(f"Liste1 uzunluğu: {len(liste1)}") # Çıktı: 3
# Bir öğenin listede olup olmadığını kontrol etme
print(f"2 listede mi? {'2' in liste1}") # Çıktı: False (int 2, str '2' değil)
print(f"2 listede mi? {2 in liste1}") # Çıktı: True
print(f"7 listede mi? {7 not in liste2}") # Çıktı: TrueDeğiştirilebilirlik (Mutability): Listeler değiştirilebilir veri yapılarıdır. Bu, içeriklerinin oluşturulduktan sonra değiştirilebileceği anlamına gelir. Bu özellik, listelerin esnekliğini artırır ancak aynı zamanda dikkatli kullanılmasını gerektirir, özellikle liste kopyalama ve referans verme durumlarında.
Heterojen Öğeler: Bir Python listesi, farklı veri tiplerindeki (örneğin, tam sayı, dize, boolean, hatta başka bir liste) öğeleri aynı anda barındırabilir.
Sıralı Yapı ve Dizinleme: Listelerdeki öğeler belirli bir sırayı korur ve bu sıraya dizin numaraları (0'dan başlayarak) aracılığıyla erişilebilir. Dizin dışı bir öğeye erişim denemesi IndexError hatasına yol açar.
Kopyalama Davranışı: Bir listeyi basit bir atama (örneğin, yeni_liste = eski_liste) ile kopyalamak, yeni bir liste oluşturmaz, yalnızca orijinal listenin referansını kopyalar. Bu, her iki değişkenin de aynı listeyi işaret ettiği anlamına gelir. Bağımsız bir kopya oluşturmak için .copy() metodu veya dilimleme [:] kullanılmalıdır (örn. yeni_liste = eski_liste.copy()).
Yüksek Performanslı İşlemler: Büyük listelerde sık sık ekleme/çıkarma işlemleri yapılıyorsa, performans sorunları yaşanabilir. Bu tür senaryolarda, collections.deque gibi alternatif veri yapıları daha uygun olabilir.
                PHP programlamada, bir uygulamanın çalışma zamanında beklenmedik durumlarla karşılaşması yaygın bir senaryodur. Bu tür durumlar, programın normal akışını bozarak hatalara veya istenmeyen davranışlara yol açabilir. PHP'de bu tür durumları zarif ve kontrollü bir şekilde yönetmek için istisnalar (exceptions) mekanizması kullanılır. İstisnalar, hata koşullarını temsil eden nesnelerdir ve programın hatayı yakalamasına, işlemesine ve uygun bir yanıt vermesine olanak tanır. Bu kılavuz, PHP dilinde istisnaların temel sözdizimini, detaylı kullanımını ve pratik örneklerini adım adım açıklamaktadır.
PHP'de istisna yönetimi, try, catch ve isteğe bağlı olarak finally blokları kullanılarak gerçekleştirilir. Bu yapı, potansiyel olarak istisna fırlatabilecek kodun yürütülmesini izlemek ve fırlatılan istisnaları ele almak için tasarlanmıştır.
İstisna yönetimi yapısının her bir bileşeni belirli bir amaca hizmet eder:
try Bloğu: Potansiyel olarak bir istisna fırlatabilecek kodun bulunduğu alandır. Program bu blok içindeki kodun yürütülmesini izler. Eğer try bloğu içinde bir istisna fırlatılırsa, PHP normal akışı durdurur ve fırlatılan istisnayı yakalayabilecek uygun bir catch bloğu arar.
catch Bloğu: Bir try bloğunda fırlatılan istisnaları yakalamak ve işlemek için kullanılır. Her catch bloğu, yakalamak istediği istisna tipini (sınıfını) belirtir. PHP, fırlatılan istisna nesnesinin tipiyle eşleşen ilk catch bloğunu yürütür. Bir istisna yakalandığında, catch bloğu içindeki kod çalıştırılır ve bu, hatanın ele alınmasını sağlar. Birden fazla catch bloğu kullanarak farklı istisna tiplerini ayrı ayrı ele alabilirsiniz.
finally Bloğu: PHP 5.5'ten itibaren kullanılabilen bu blok, try ve catch blokları tamamlandıktan sonra, bir istisna fırlatılsın veya fırlatılmasın, her zaman yürütülecek kodu içerir. Bu, veritabanı bağlantılarını kapatma, dosya tanıtıcılarını serbest bırakma gibi temizleme (cleanup) işlemleri için son derece kullanışlıdır ve kaynak sızıntılarını önlemeye yardımcı olur.
throw Anahtar Kelimesi: Bir istisna fırlatmak için kullanılır. Bir Exception sınıfının veya ondan türetilmiş bir sınıfın nesnesiyle birlikte kullanılır. Örneğin: throw new Exception("Hata mesajı");
Exception Sınıfı: PHP'de tüm yerleşik ve özel istisnaların türediği temel sınıftır. Kendi özel istisna sınıflarınızı oluştururken genellikle bu sınıftan türetirsiniz.
Aşağıdaki örnekler, istisna yönetiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Temel İstisna Yakalama
";
    echo bolmeIslemi(5, 0) . "
"; // Bu satırda istisna fırlatılacak
    echo bolmeIslemi(20, 4) . "
"; // Bu satır çalışmayacak
} catch (Exception $e) {
    echo "Hata yakalandı: " . $e->getMessage() . "
";
}
echo "Program devam ediyor.
";
?>Bu örnekte, bolmeIslemi fonksiyonu sıfıra bölme durumunda bir istisna fırlatır. try bloğu içinde bu istisna yakalanır ve hata mesajı ekrana yazdırılır. İstisna fırlatıldıktan sonra try bloğundaki diğer kodların çalışmadığına dikkat edin.
Örnek 2: Çoklu catch Blokları ve Özel İstisnalar
Kendi özel istisna sınıflarınızı tanımlayarak daha spesifik hata durumlarını ele alabilirsiniz. Özel istisna sınıfları genellikle Exception sınıfından türetilir.
getMessage() . "
";
} catch (VeritabaniBaglantiHatasiException $e) {
    echo "Veritabanı hatası yakalandı: " . $e->getMessage() . "
";
} catch (Exception $e) { // Diğer tüm istisnaları yakalamak için
    echo "Genel bir hata yakalandı: " . $e->getMessage() . "
";
} finally {
    echo "İşlem tamamlandı, kaynaklar serbest bırakılıyor (finally bloğu).
";
}
?>Bu örnek, farklı hata türlerini ele almak için birden çok catch bloğunun nasıl kullanılacağını gösterir. finally bloğu ise, istisna fırlatılsa da fırlatılmasa da her zaman çalışarak temizleme işlemleri için bir garanti sağlar.
Örnek 3: İstisnaları Yeniden Fırlatma (Re-throwing Exceptions)
Bazen bir istisnayı yakalayıp belirli bir işlem yaptıktan sonra, daha yüksek bir seviyede ele alınması için yeniden fırlatmak isteyebilirsiniz.
getMessage());
        // İstisnayı daha yüksek bir seviyede yakalanmak üzere yeniden fırlat
        throw new Exception("Dosya işlemi sırasında bir sorun oluştu.", 0, $e);
    }
}
try {
    $data = dosyaOku("olmayan_dosya.txt");
    echo "Dosya içeriği: " . $data . "
";
} catch (Exception $e) {
    echo "Uygulama seviyesinde hata: " . $e->getMessage() . "
";
    if ($e->getPrevious()) {
        echo "Önceki hata: " . $e->getPrevious()->getMessage() . "
";
    }
}
?>Bu örnekte, dosyaOku fonksiyonu bir istisna yakalar, loglar ve ardından daha genel bir istisna mesajıyla yeniden fırlatır. Yeniden fırlatılan istisnaya orijinal istisna, getPrevious() metodu ile erişilebilir.
Spesifik catch Blokları Önce Gelmeli: Birden fazla catch bloğu kullanırken, daha spesifik istisna sınıflarını (GecersizParametreException gibi) genel Exception sınıfından önce yerleştirin. Aksi takdirde, daha genel olan blok tüm istisnaları yakalar ve spesifik bloklara asla ulaşılamaz.
İstisnaları Yutmaktan Kaçının: Bir istisnayı yakalayıp hiçbir işlem yapmadan (boş bir catch bloğu) bırakmak, hataların gizlenmesine ve hata ayıklamanın zorlaşmasına neden olur. Her zaman yakalanan istisnayı loglayın, kullanıcıya anlamlı bir mesaj gösterin veya uygun şekilde ele alın.
Sadece Hata Durumları İçin Kullanın: İstisnalar, programın normal akışının bir parçası olmayan, beklenmedik hata durumları için tasarlanmıştır. Kontrol akışını yönlendirmek için istisnaları kullanmaktan kaçının (örneğin, bir döngüyü kırmak için).
Throwable Arayüzü: PHP 7'den itibaren, hem Exception hem de Error sınıflarının uyguladığı Throwable arayüzü tanıtılmıştır. Bu, hem istisnaları hem de ciddi hataları (örneğin, bellek tükenmesi) tek bir catch (Throwable $e) bloğu ile yakalamanıza olanak tanır.
Standart İstisna Sınıfları: PHP, InvalidArgumentException, RuntimeException, PDOException gibi birçok yerleşik istisna sınıfı sağlar. Uygulamanızda bu standart sınıfları veya bunlardan türettiğiniz özel sınıfları kullanmak iyi bir pratiktir.
2025 © Tüm Hakları Saklıdır.