PHP Tanımı ve Özellikleri

PHP Tanımı ve Özellikleri

PHP (PHP: Hypertext Preprocessor), sunucu tarafında çalışan, genel amaçlı ve HTML içine gömülebilen açık kaynak bir betik dilidir. 1995 yılında Rasmus Lerdorf tarafından “Personal Home Page” (Kişisel Ana Sayfa) betiklerini geliştirmek üzere ortaya çıkarılmıştır. Zaman içinde PHP/FI, PHP3, PHP4 gibi sürümleri görülmüş, Zend Technologies tarafından 1997’de PHP’nin çekirdeği yeniden yazılmış ve dilin adı “Hypertext Preprocessor” olarak değiştirilmiştir. Günümüzde PHP’nin gelişimi PHP Grubu, Zend ve PHP Foundation gibi topluluklarca sürdürülemektedirt. PHP dosyaları genellikle .php, .phtml, .phar, .pht uzantılarıyla saklanır. PHP kodları sunucu tarafından yorumlanır; kullanıcı tarayıcısına yalnızca oluşan HTML çıktısı iletilir, bu sayede kodun kaynakları gizli kalır.

PHP’nin önemli özellikleri arasında kolay öğrenilebilir olması, ücretsiz ve açık kaynak olması, platform bağımsızlığı ve geniş bir topluluk tarafından desteklenmesi sayılabilir. Dili öğrenmek genellikle hızlıdır ve birkaç saat içinde basit programlar yazılmaya başlanabilir. Öte yandan PHP, sadece basit betiklerden öteye geçebilecek güçlü nesne yönelimli programlama olanakları ve geniş kütüphane desteği sunar.

PHP ile hemen hemen her türlü web uygulaması geliştirilebilir: formdan veri toplama, dinamik sayfa oluşturma, çerez yönetimi gibi temel CGI işlemlerinden; e-posta gönderme, şifreleme, görüntü PDF oluşturma, JSON/XML işleme gibi gelişmiş görevlere kadar çok geniş bir yelpaze vardır. Ayrıca PHP komut satırında da kullanılabilir; bu sayede sunucu gerekmez, zamanlanmış görevler veya metin işleme işleri PHP ile yapılabilir. PHP, Linux, Windows, macOS ve diğer birçok işletim sisteminde çalışır ve Apache, IIS, Nginx gibi popüler HTTP sunucularını destekler. Güçlü bir veritabanı bağlantı altyapısı vardır: MySQL, PostgreSQL, SQLite, Oracle, SQL Server gibi birçok veritabanına yerleşik eklentiler veya PDO (Php Data Objects) üzerinden ulaşılabilir.

PHP

Ücretsiz ve açık kaynaklıdır; büyük geliştirici topluluğu tarafından desteklenir. Platform bağımsızdır (Linux, Windows, macOS vb.). HTML ile kolayca entegre olur, hızlı geliştirmeye olanak tanır. Öğrenmesi görece kolaydır ve yüksek performanslıdır. Zengin standart kütüphaneleri sayesinde (ör. dizi, string, matematik, tarih, veri tabanı işlevleri) karmaşık görevler kolaylıkla gerçekleştirilir.

PHP’deki kütüphane terimi, belirli görevleri yerine getirmek üzere bir araya getirilmiş işlev ve sınıflar bütününü ifade eder. Örneğin, PDO (Php Data Objects), mysqli, GD kütüphanesi, PEAR/Composer paketleri, Symfony veya Laravel gibi framework’ler PHP kütüphaneleri sayılabilir. Bu kütüphaneler, sık kullanılan işlevleri hazır halde sunduğu için geliştiricilerin işini hızlandırır. Kısaca, “PHP kütüphanesi” bir geliştiricinin bir görevi gerçekleştirmek için hazır kod bloklarını kullanabileceği kaynak kod koleksiyonudur.

PHP Geliştirme Ortamları

PHP kodu yazmak, derlemek veya çalıştırmak için bir IDE (Entegre Geliştirme Ortamı) kullanılabilir. IDE, yazılım geliştirmeyi kolaylaştıran bir yazılımdır. Kod editörü, hata ayıklayıcı, derleyici (interpreter), sürüm kontrol araçları gibi bileşenleri tek çatı altında sunar. Örneğin Visual Studio Code, PHPStorm, NetBeans, Eclipse (PDT eklentisi ile), Sublime Text ve Atom yaygın PHP geliştirme ortamlarıdır. Bu IDE’ler otomatik tamamlama, sözdizimi vurgulama (syntax highlighting), anlık hata bulma (linting), gömülü terminal gibi özelliklerle kodlama hızını ve doğruluğunu artırır. VS Code gibi modern editörler açık kaynaklı ve geniş eklenti ekosistemine sahiptir. Örneğin VS Code, PHP sözdizimini yerleşik olarak destekler ve marketten eklentilerle güçlü bir PHP IDE’ye dönüştürülebilir.

PHP geliştirme için ayrıca bütünleşik sunucu paketleri kullanılır. Bu paketler, bilgisayarınıza kolayca Apache web sunucusu, PHP yorumlayıcı ve veritabanı (MySQL/MariaDB) kurmanızı sağlar:

AppServ: Windows için hazırlanmış bir web geliştirme paketi olup Apache, PHP, MySQL, phpMyAdmin gibi bileşenleri içerir. Kurulumdan sonra C:\AppServ\www klasörü oluşturulur; bu klasöre yerleştirdiğiniz PHP projelerine http://localhost/proje_adı ile erişirsiniz. AppServ kontrol paneli üzerinden Apache ve MySQL servislerini başlatıp durdurabilirsiniz.

WAMP: “Windows, Apache, MySQL, PHP” sözlerinin kısaltmasıdır. Windows üzerinde hızlı kurulum ve yapılandırma yapmayı sağlar. WAMP kurulu bilgisayarı hem istemci hem de sunucu gibi kullanmanıza olanak verir. Başlangıç için kullanımı kolaydır.

XAMPP: “Cross-platform (Çapraz platform), Apache, MySQL, PHP, Perl” içeren bir pakettir. Windows, macOS ve Linux’ta çalışır. Hızlı kurulum sunar ve açık kaynaklıdır. Bilgisayarınızı hem HTTP hem de veritabanı sunucusu haline getirir.

MAMP: “macOS, Apache, MySQL, PHP” içerir ama Windows sürümü de vardır. MAMP, geliştiricilere PHP ve MySQL desteğiyle macOS üzerinde lokal sunucu ortamı sağlar. Hemen kurulup çalışabilen bir ortamdır.

Navicat: Çoklu veritabanını destekleyen görsel bir veritabanı yönetim aracıdır. MySQL, MariaDB, PostgreSQL, Oracle, SQLite gibi birçok veritabanına bağlanabilir. Sürükle-bırak arayüzü ile tablolar oluşturma, sorgu çalıştırma, veri yedekleme/güncelleme gibi işlemler yapılır.

CuteFTP: Grafiksel bir FTP istemcisidir. Bir bilgisayarı FTP sunucusuna bağlayarak dosya transferi yapmanızı sağlar. CuteFTP ile büyük boyutlu dosyalar bile kolayca sunucuya yüklenir; aktarım devam etme, duraklatma gibi özelliklere sahiptir. (Alternatif olarak FileZilla gibi başka FTP programları da kullanılabilir.)

PHP’de Veri Türleri

PHP değişkenleri, içerdiği değerin türüne göre otomatik tip kazanır. Başlıca PHP veri türleri şunlardır:

  • Integer: Tam sayıları saklar (örnek: -12, 0, 34 gibi). Ondalık bölüm içermez.
  • Float (Double): Ondalıklı sayılar (ör. 3.14, -0.5).
  • String: Metin (alfanümerik) değerleri saklar; tek veya çift tırnak içinde tanımlanır ("Merhaba", '123').
  • Boolean: Mantıksal değerlerdir; yalnızca true veya false alır.
  • Array (Dizi): Birden fazla değeri tek bir değişken altında saklayan koleksiyonlar. İndex numaralı diziler veya anahtarlı (associative) diziler olabilir.
  • Object: Sınıf örnekleri (nesne) tipidir. PHP 5 ve sonrası sürümlerde class ile tanımlanan nesneler Object tipinde olur.
  • NULL: Boş değeri temsil eder; bir değişkene “değer atanmadı” anlamı verir.
  • Resource: Harici bir kaynağa (örn. veritabanı bağlantısı, dosya tanıtıcısı) işaret eden özel türdür.

Bu temel türler dışında, PHP’de veri tipleri genellikle dinamik ve gevşek tipli olduğundan, örneğin bir değişkene önce sayı, sonra metin atanabilir. Fonksiyonlara herhangi türde argüman verilebilir ve PHP gerektiğinde otomatik dönüşüm yapar. Örneğin $x = 10; $x = "metin"; gibi.

PHP Operatörler

Operatör (İşleç), değişkenler veya değerler arasındaki işlemleri gerçekleştiren semboller veya anahtar kelimelerdir. PHP’de farklı işlem grupları vardır. Başlıca operatör grupları:

  • Aritmetik Operatörler: Matematiksel işlemler için kullanılır. Toplama (+), çıkarma (-), çarpma (*), bölme (/), modül (%) operatörleri vardır. Örnek: $c = $a + $b;, $d = $a * $b;.
  • Karşılaştırma Operatörleri: İki değer arasındaki ilişkiyi test eder. Eşitlik ==, tam eşitlik ===, eşit değildir != (veya <>), küçüktür <, büyüktür >, küçüktür eşittir <=, büyüktür eşittir >= gibi operatörler vardır. Örneğin if ($x === 5) {…}.
  • Mantıksal Operatörler: Koşulları birleştirmek için kullanılır. && veya and (ve), || veya or (veya), ! (değil) gibi operatörleri içerir. Örnek: if ($a > 0 && $b < 10) { … }.
  • Bit Düzeyinde (Bitwise) Operatörler: İkili düzeyde işlemler yapar. & (bit ve), | (bit veya), ^ (bit XOR), ~ (bit değil), << (sol kaydırma), >> (sağ kaydırma) operatörleri vardır. Örneğin 5 & 3 işlemi ikili düzeyde inceleme yapar.
  • Atama Operatörleri: Değişkene değer atamak için kullanılır. = atama operatörüdür. Ayrıca +=, -=, *=, /=, %=, .=, &=, |=, ^= gibi kısaltmalı atama operatörleri vardır (ör. $a += 5; aynı zamanda $a = $a + 5; demektir).
  • Dizisel Operatörler: Diziler için özel operatörlerdir. Örneğin iki diziyi birleştiren bir “+” operatörü vardır: ['a'=>1] + ['b'=>2] gibi. Ayrıca dizi karşılaştırma operatörleri (==, ===) dizinin eleman yapısını kontrol etmek için özelleşmiştir.
  • Özel Operatörler:
    • Ternary Operatör (?:): Kısa koşullu ifade sağlar: $z = ($x>0) ? $a : $b;.
    • Null Birleştirme Operatörü (??): Değer atanmış mı kontrolü: $z = $_POST['yazı'] ?? 'Varsayılan';.
    • Dizgi Birleştirme Operatörü (.): Stringleri birleştirir: "Merhaba"." Dünya".
    • Instanceof: Nesne tipi kontrolü: if ($nesne instanceof Sinif) { … }.
    • At (@): Hata bastırma operatörüdür. @ işaretiyle başlayan ifadede oluşan uyarı/hatayı görmezden gelir (ancak kullanımı genellikle önerilmez).

Her operatör grubu farklı amaç için kullanılır. Örneğin matematiksel işlemler için aritmetik operatörler, mantıksal karşılaştırmalarda AND/OR operatörleri, döngülerde artırım (++$i, $i++) ve azalış (--$i, $i--) operatörleri kullanılır. Operatörlerin detaylı listesi ve örnek kullanımları PHP dokümantasyonunda mevcuttur.

PHP ile PDO (PHP Veri Nesneleri) Üzerinden Veritabanı İşlemleri

PHP’de veritabanı erişimi için en yaygın yöntemlerden biri PDO (PHP Data Objects) kullanımını içerir. PDO, çeşitli veritabanlarına ortak bir arayüzle erişim sağlayan bir eklentidir. PDO kullanarak SQL sorguları güvenli ve tutarlı bir şekilde çalıştırılır; hangi veritabanını kullandığınızdan bağımsız olarak benzer yöntemler üzerinden işlem yapılabilir. (PDO, SQL sorgularını soyutlamaz; SQL ifade yapınızı veritabanının anlayacağı şekilde kendiniz yazarsınız.) Aşağıda PDO ile yapılan bazı temel işlemler ele alınmıştır:

PDO Sürücüleri ve getAvailableDrivers(): PDO farklı veritabanlarına bağlanmak için sürücüler kullanır (örneğin pdo_mysql, pdo_sqlite vb.). PDO::getAvailableDrivers() statik metodu, kurulu olan PDO sürücülerinin bir listesini döndürür. Örneğin print_r(PDO::getAvailableDrivers()); mevcut PDO sürücülerini ekrana yazar.

Veritabanına Bağlanma: PDO ile bağlantı, PDO sınıfının constructor’ı ile yapılır. Örneğin MySQL için:

$dsn = "mysql:host=localhost;dbname=veritabani_adi;charset=utf8";
$kullanici = "kullanici_adi";
$sifre = "sifre";
try {
    $db = new PDO($dsn, $kullanici, $sifre);
} catch (PDOException $e) {
    die("Bağlantı hatası: " . $e->getMessage());
}

Bu şekilde $db değişkeni PDO örneğini tutar ve veritabanına bağlanır. Hata oluşursa PDOException fırlatılır ve yakalanabilir. Başarılı bağlantı sonrası $db üzerinden sorgular çalıştırılır.

Birden Fazla Veritabanı Bağlantısı: İhtiyaç duyduğunuz kadar farklı $db değişkeni ile farklı veritabanlarına bağlanabilirsiniz. Örneğin hem MySQL hem SQLite ile çalışacaksanız iki ayrı PDO örneği oluşturabilirsiniz.

exec() ve query() Metodları: SQL sorgusu çalıştırmak için kullanılır. exec() metodu tipik olarak INSERT, UPDATE, DELETE, CREATE, DROP gibi veri değiştiren sorgular için kullanılır ve etkilenen satır sayısını döndürür. Örneğin $satirSayisi = $db->exec("DELETE FROM tablo WHERE id=5");. query() ise genellikle SELECT gibi veri döndüren sorgular için kullanılır; bir PDOStatement nesnesi döndürür.

Veritabanı/Tablo Oluşturma ve Kopyalama: Yeni bir veritabanı veya tablo oluşturmak için standart SQL komutları kullanılır. Örneğin MySQL’de yeni DB için CREATE DATABASE yeni_db;, tablo için CREATE TABLE tablo_adi (id INT PRIMARY KEY, ...);. Bu komutları PDO ile çalıştırmak için $db->exec() kullanılabilir. Mevcut bir tablonun kopyasını oluşturmak için CREATE TABLE kopya AS SELECT * FROM orijinal; tarzı SQL ifadeleri yazılabilir.

Tablo Adı Değiştirme ve Taşıma: Bir tabloyu yeniden adlandırmak için ALTER TABLE eskidad RENAME TO yenidad; kullanılır. Veritabanları arasında tablo kopyalamak için öncelikle hedef veritabanında tabloyu oluşturup, eski veritabanından INSERT INTO hedef SELECT * FROM kaynak; ile içeriği kopyalayabilirsiniz.

Veritabanı/Tablo Silme: Veritabanını silmek için DROP DATABASE veritabani_adi;, tablo silmek için DROP TABLE tablo_adi; SQL ifadeleri kullanılır. Bu komutları $db->exec() ile çalıştırabilirsiniz.

Sütun Ekleme/Güncelleme/Silme: Bir tabloya yeni sütun eklemek için ALTER TABLE tablo_adi ADD COLUMN yeni_sutun TİP;, sütun tipini değiştirmek için (örn. MySQL’de) ALTER TABLE tablo_adi MODIFY COLUMN sutun_adi YENİ_TİP;, sütunu silmek için ALTER TABLE tablo_adi DROP COLUMN sutun_adi; kullanılır.

Tablo İçeriğini Boşaltma: Tablo içindeki tüm verileri silip yapısını korumak için TRUNCATE TABLE tablo_adi; komutu kullanılır. Bu komut da $db->exec() ile yapılır.

Tablo/Sütun Bilgisi Öğrenme: Mevcut tabloları listelemek için SHOW TABLES; (MySQL için) veya SELECT name FROM sqlite_master WHERE type='table'; (SQLite için) gibi sorgular çalıştırılabilir. Bir tablonun sütun bilgilerini almak için MySQL’de DESCRIBE tablo_adi;, PostgreSQL’de SELECT column_name, data_type FROM information_schema.columns WHERE table_name='tablo_adi'; kullanılabilir.

Bakım/Onarım İşlemleri: MySQL’de tablo onarımı için REPAIR TABLE tablo_adi;, optimizasyon için OPTIMIZE TABLE tablo_adi; gibi SQL komutları vardır. Bu komutlar da PDO ile çalıştırılabilir.

Veri Okuma (query(), fetch(), fetchAll()): Verileri okumak için SELECT sorgusu yapılır. Örneğin:

$stmt = $db->query("SELECT * FROM kisiler WHERE yas > 30");
$sonuc = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($sonuc as $satir) {
    echo $satir['isim'] . "\n";
}

Burada query() bir PDOStatement döner. fetch() veya fetchAll() metodları ile sonuç satırlarını dizi olarak alabilirsiniz. PDO::FETCH_ASSOC tipik olarak sütun isimlerini anahtar olarak alır. (Alternatif olarak PDO::FETCH_OBJ ile nesne, PDO::FETCH_NUM ile numaralı dizi elde edilebilir.)

LIMIT ve ORDER BY: Verileri sınırlandırmak veya sıralamak için SQL’de LIMIT, OFFSET ve ORDER BY ifadeleri kullanılır. Örneğin SELECT * FROM tablo ORDER BY tarih DESC LIMIT 10; sorgusu, tabloyu tarih sütununa göre azalan sırada sıralar ve ilk 10 kaydı getirir.

WHERE İfadesi: Veriyi filtrelemek için SQL’de WHERE kullanılır. Örneğin SELECT * FROM urunler WHERE fiyat > 100; komutu fiyatı 100’den büyük olan ürünleri seçer.

rowCount(): exec() veya query() sonrası, etkilenen satır sayısını öğrenmek için $db->rowCount() (PDO nesnesiyle değil, yapılan işlemlere bağlı) kullanılabilir. Daha yaygın olarak $stmt = $db->query(...); echo $stmt->rowCount(); gibi satır sayısını alabilirsiniz (MySQL için SELECT sorgusunda bu her zaman doğru sonuç vermez; UPDATE/DELETE için daha güvenilirdir).

JOIN İfadeleri: Birden fazla tabloyu birleştirmek için SQL JOIN kullanılır. PDO ile tüm JOIN türleri (INNER JOIN, LEFT JOIN, RIGHT JOIN, NATURAL JOIN vs.) SQL sorgusuna yazılarak kullanılabilir. Örnek: SELECT * FROM tablo1 INNER JOIN tablo2 ON tablo1.id = tablo2.ref_id;.

COUNT, MIN, MAX, SUM, AVG: Veri toplama (aggregate) fonksiyonlarıdır. Örneğin SELECT COUNT(*) FROM tablo;, SELECT SUM(miktar) FROM satis;, SELECT MIN(fiyat), MAX(fiyat) FROM urunler;, SELECT AVG(puan) FROM yorumlar; gibi sorgular PDO ile çalıştırılabilir.

DISTINCT, GROUP BY, HAVING: Aynı sütun değerini birden fazla gösterimi engellemek için SELECT DISTINCT, gruplama için GROUP BY, gruplara koşul uygulamak için HAVING kullanılır. Örneğin SELECT COUNT(*), kategori FROM urunler GROUP BY kategori HAVING COUNT(*) > 5; belirli kategori başına ürün sayısı 5’ten fazla olanları verir.

INSERT INTO (Yeni Veri Ekleme): Yeni kayıt eklemek için INSERT INTO tablo (kol1, kol2) VALUES ('değer1','değer2'); kullanılır. PDO ile $db->exec("INSERT INTO tablo ..."); veya daha güvenli yöntem olan hazırlıklı ifade (prepared statement) ile yapılabilir.

lastInsertId() Kullanımı: Bir INSERT işleminden sonra, eklenen kaydın otomatik artan (AUTO_INCREMENT) ID değerini almak için $db->lastInsertId() kullanılabilir. Örneğin:





$db->exec("INSERT INTO kisiler (isim) VALUES ('Ali')");
$yeniId = $db->lastInsertId();
echo "Yeni eklenen kaydın ID'si: $yeniId";

UPDATE (Veri Güncelleme): Varolan kayıtları değiştirmek için UPDATE tablo SET sutun1='deger' WHERE kosul; komutu kullanılır. Örnek: UPDATE kisiler SET yas = 31 WHERE isim = 'Ayşe'; satırı Ayşe olan kişinin yaşını 31 yapar.

REPLACE (Veri Güncelleme veya Ekleme): MySQL’e özel bir komuttur. REPLACE INTO tablo (...) VALUES (...) yazıldığında eğer belirtilen birincil anahtar (primary key) zaten varsa o kaydı silip yeni kayıt ekler; yoksa normal INSERT gibi çalışır. Yani “güncelle veya ekle” mantığı vardır.

DELETE (Veri Silme): Kaydı silmek için DELETE FROM tablo WHERE kosul; komutu kullanılır. Örneğin DELETE FROM urunler WHERE stok=0; sıfır stoklu ürünleri siler. Tüm kayıtları silmek için koşulsuz DELETE veya TRUNCATE kullanılabilir.

Hazırlıklı İfadeler (Prepared Statements): PDO’nun en önemli özelliği budur. Sorgu şablonları hazırlanıp (örn. SELECT * FROM tablo WHERE id = :id), değişkenler bindParam() veya bindValue() ile bağlanarak execute() edilir. Bu yöntem SQL enjeksiyonunu önler ve tekrar eden sorgularda performans sağlar. Örneğin:

$stmt = $db->prepare("SELECT * FROM kullanicilar WHERE email = :email");
$stmt->bindValue(':email', $ePosta);
$stmt->execute();
$kullanici = $stmt->fetch(PDO::FETCH_ASSOC);
  • Burada :email adıyla bir parametre tanımlanıp, bindValue ile kullanıcıdan gelen e-posta değeri güvenli biçimde yerine konulur.
  • Transaction (İşlemler): Birden çok SQL komutunun tek paket halinde başarılı ya da başarısız olmasını sağlamak için kullanılır. PDO’da $db->beginTransaction(); ile işlem başlatılır, gerekli sorgular çalıştırılır; sorun yoksa $db->commit(); ile onaylanır, hata olursa $db->rollBack(); ile tüm değişiklikler geri alınır. Bu, özellikle banka transferleri veya toplu veri güncellemeleri gibi durumlarda veri bütünlüğü için kritiktir.

PDO ile yapılan her sorguda hata denetimi ve gerekli önlemler alınmalıdır. Örneğin bir sorgu başarısız olduğunda istisna fırlatması için $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); gibi ayarlar yapılabilir. Özetle, PDO veritabanı işlemlerini çok esnek ve güvenli bir şekilde gerçekleştirmenize olanak tanır.

Sonuç

PHP, web dünyasının en köklü ve en güçlü sunucu tarafı dillerinden biridir. Temellerinden itibaren anladığımızda, yalnızca bir “kodlama dili” olmadığını; dinamik web uygulamalarının kalbinde yer alan, veritabanı yönetimi, kullanıcı etkileşimi, dosya işlemleri ve güvenlik gibi alanları bir araya getiren güçlü bir platform olduğunu fark ederiz.

Bu yazıda PHP’nin tarihçesinden dosya yapısına, IDE seçiminden geliştirme ortamlarına, veri türlerinden operatörlere, hatta ileri düzeydeki PDO (PHP Data Objects) yapısına kadar kapsamlı bir yolculuk yaptık.

Artık bir web geliştiricisi olarak:

  • PHP’nin nasıl çalıştığını,
  • Hangi araçlarla geliştirme yapılabileceğini,
  • Veritabanı bağlantılarını nasıl yöneteceğinizi,
  • Kodunuzu nasıl güvenli, verimli ve sürdürülebilir hale getireceğinizi biliyorsunuz.

PHP öğrenmeye devam ederken en önemli şey pratik yapmaktır. Küçük projeler geliştirin, hatalar yapın, sonra düzeltin. PHP’nin açık kaynak topluluğu oldukça güçlüdür — belgeleri, Stack Overflow gibi platformları ve PHP.net dokümantasyonunu mutlaka inceleyin.

Unutmayın: Her satır kod, sizi daha iyi bir geliştirici yapar.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir