Bunlar mülakatlarda en çok karşılaşılan PHP sorularıdır; PHP 8.3 için doğru olan kısa yanıtlar ve kodun bir şey kanıtladığı yerlerde kod içerir. Run düğmesine basmadan önce her bloğun çıktısını tahmin edin: mülakatçının test ettiği şey budur.
Başlangıç seviyesi PHP mülakat soruları
PHP nedir ve nasıl çalışır?
PHP sunucu taraflı bir betik dilidir. Bir web sunucusu (Nginx veya Apache) isteği PHP'ye (genellikle PHP-FPM) iletir, PHP betiği baştan çalıştırır ve yazdırdığı her şey yanıt olur, genellikle HTML. Her istek temiz başlar: değişkenleri bir oturumda, bir veritabanında veya bir önbellekte saklamadıkça istekler arasında yaşamazlar. PHP betikleri komut satırında da çalıştırır (php script.php).
== ile === arasındaki fark nedir?
== tür dönüştürmeden (type juggling) sonra karşılaştırır, === dönüşüm olmadan değeri ve türü karşılaştırır. Yukarıdaki ısınma bloğu == operatörünü iş başında gösterir: sayısal dizgeler sayı olarak karşılaştırılır, bu yüzden '10' == '1e1' true olur. PHP 8'den beri sayısal olmayan bir dizgeyle karşılaştırılan bir sayı dizge olarak karşılaştırılır, bu yüzden 0 == 'a' false olur (PHP 7'de true idi). İki operatörü karşılaştırmak için hücrelere dokunun:
| $a == $b | true | false | 0 | 1 | "0" | "1" | "" | null | [] | "a" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | ||||||||||||
| false | ||||||||||||
| 0 | ||||||||||||
| 1 | ||||||||||||
| "0" | ||||||||||||
| "1" | ||||||||||||
| "" | ||||||||||||
| null | ||||||||||||
| [] | ||||||||||||
| "a" | ||||||||||||
| "10" | ||||||||||||
| "1e1" |
Varsayılan olarak === kullanın. in_array() ve array_search() üçüncü argüman olarak true vermediğiniz sürece == kullanır.
echo ile print arasındaki fark nedir?
İkisi de dizge çıktısı verir. echo birkaç argüman alır (echo $a, $b;) ve hiçbir şey döndürmez; print tek argüman alır ve 1 döndürür, bu yüzden bir ifadede kullanılabilir. İkisi de fonksiyon değildir, bu yüzden parantezler isteğe bağlıdır. Pratikte herkes echo kullanır.
Tek tırnak ile çift tırnak?
Çift tırnaklı dizgeler değişkenleri ve kaçış dizilerini yorumlar: "Hi $name\n". Tek tırnaklı dizgeler \' ve \\ dışında düzdür: 'Hi $name\n' tam olarak o karakterleri yazdırır. Hız farkı önemsizdir, bu yüzden seçim okunurlukla ilgilidir: değişken yerleştirdiğinizde çift, yerleştirmediğinizde tek tırnak.
PHP'de veri türleri nelerdir?
Dört skaler tür (int, float, string, bool), iki bileşik tür (array ve object) ve iki özel tür (null ve resource). callable, iterable, mixed ve void yalnızca tür bildirimleri olarak vardır, asla bir değerin türü olarak değil. gettype() ve get_debug_type() bir değerin türünü çalışma zamanında söyler, var_dump() ise onu değerle birlikte yazdırır.
isset, empty ve is_null arasındaki fark nedir?
isset($x) değişken var ve null değilse true olur. empty($x) değişken yoksa veya falsy ise (0, '0', '', [], false, null) true olur. is_null($x) null için true olur, ama tanımsız bir değişkende uyarı verir. isset ve empty asla uyarı vermez, dizi anahtarlarında kullanılmalarının nedeni budur.
| $x | isset | empty | is_null |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| "0" | |||
| "" | |||
| " " | |||
| [] | |||
| "a" | |||
| 0.0 |
İnsanların yanlış bildiği satır "0" satırıdır: sıfır dizgesi boştur, " " (bir boşluk) ise değildir. Tam tablo isset sayfasında.
include ile require arasındaki fark nedir?
İkisi de başka bir dosyayı ekler ve çalıştırır. Dosya eksikse include bir uyarı verir ve betik devam eder, require ise bir şey onu yakalamadıkça betiği durduran bir Error ("Failed opening required") fırlatır. _once biçimleri (include_once, require_once) zaten yüklenmiş bir dosyayı atlar, bu da "cannot redeclare function" hatalarını önler. Betiğin onsuz çalışamayacağı dosyalar için require (veya require_once) kullanın, ki bu neredeyse hepsidir; Composer'ın otomatik yükleyicisi elle yapılan dahil etmelerin çoğunu gereksiz kılar.
GET ile POST arasındaki fark nedir?
GET veriyi URL'nin sorgu dizgesinde ($_GET) gönderir, bu yüzden görünür, yer imlerine eklenebilir ve uzunluğu sınırlıdır; arama ve sayfalama gibi okuma işlemleri için kullanın. POST veriyi istek gövdesinde ($_POST) gönderir; giriş, kaydetme veya ödemeler gibi durumu değiştiren her şey için kullanın. Bir GET isteği asla veriyi değiştirmemelidir, çünkü bağlantılar önceden getirilir ve robotlar tarafından taranır.
Null birleştirme operatörü nedir?
$a ?? $b $a var ve null değilse $a, aksi halde $b döndürür; tanımsız bir değişken veya anahtar için uyarı vermez: $page = $_GET['page'] ?? 1;. ??= yalnızca sol taraf null veya eksik olduğunda atama yapar. Herhangi bir falsy değerde varsayılana dönen ?: operatöründen farklıdır, bu yüzden 0 ?: 5 5, ama 0 ?? 5 0 olur.
Orta seviye PHP mülakat soruları
foreach içinde referansla dolaştığınızda ne olur?
foreach ($arr as &$v) elemanları yerinde değiştirmenizi sağlar, ama $v döngüden sonra son elemana bir referans olarak kalır. Adı ikinci bir döngüde yeniden kullanmak o zaman o elemanın üzerine yazar:
Son eleman 30 değil 20 olur: ikinci döngü sırasında $v (hâlâ $arr[2]) sırayla 10, 20 ve kendisi değerlerini alır. unset($v) önündeki // işaretini kaldırın ve tekrar çalıştırın. foreach sayfası referansları ayrıntılı anlatır.
Soyut sınıf ile arayüz arasındaki fark nedir? Peki trait nedir?
Bir arayüz bir sözleşmedir: uygulaması olmayan metot imzaları (ve sabitler) ve bir sınıf birçok arayüz uygulayabilir. Bir soyut sınıf özellikler, yapıcılar ve tamamlanmış metotların yanında alt sınıflarının yazması gereken soyut metotlar tutabilir; bir sınıf yalnızca birini genişletir. Bir trait bir sınıfa use ile kopyalanan bir metotlar kümesidir; ortak bir üst sınıfı olmayan sınıflar arasında kodu yeniden kullanmak içindir.
Mülakatçıların sevdiği kısa bir yanıt: bir şeyin ne yapabileceğini söylemek için arayüz, nasıl yapıldığını paylaşmak için soyut sınıf, ilişkisiz sınıflar aynı birkaç metoda ihtiyaç duyduğunda trait kullanın.
self ile static arasındaki fark nedir?
self kodun yazıldığı sınıfa başvurur. static çalışma zamanında gerçekte çağrılan sınıfa başvurur; buna geç statik bağlama (late static binding) denir. "Bu tür nesneyi" oluşturan veya tanımlayan üst sınıf metotlarında önemlidir:
User::createStatic() bir User oluşturur. User::createSelf() bir Model oluşturur, bu da static dönüş türünü bozar, bu yüzden PHP bir TypeError fırlatır. Fabrika metotlarının new static() kullanmasının nedeni budur.
Sihirli metotlar nelerdir?
PHP'nin sizin yerinize çağırdığı ve hepsi iki alt çizgiyle başlayan metotlardır. Yaygın olanlar: bir nesne oluşturulduğunda __construct(), yok edildiğinde __destruct(), bir dizge olarak kullanıldığında __toString(), erişilemeyen özellikler için __get() ve __set(), eksik metotlar için __call() ve __callStatic(), nesne bir fonksiyon gibi çağrıldığında __invoke() ve clone sonrasında __clone().
array_merge() ile + operatörü arasındaki fark nedir?
array_merge() sona ekler: sayısal anahtarlar yeniden numaralanır ve sonraki dizge anahtarlar öncekilerin üzerine yazar. + bir birleşimdir: soldaki diziyi tutar ve yalnızca eksik anahtarları ekler, bu yüzden tekrarlanan bir anahtarda ilk değer kazanır.
Varsayılanlar için doğru araç + operatörüdür: $options + ['timeout' => 30] çağıranın verdiğini tutar ve geri kalanı doldurur.
declare(strict_types=1) ne işe yarar?
Onsuz PHP skaler argümanları mümkün olduğunda bildirilen parametre türüne dönüştürür: bir int parametresine "5" vermek 5 verir. Bir dosyanın ilk deyimi olarak declare(strict_types=1); ile o dosyadan yapılan çağrılar tam türü vermelidir, yoksa bir TypeError fırlatılır (bir float parametresine verilen bir int izin verilen tek genişletmedir).
declare satırını silin ve tekrar çalıştırın: ikinci çağrı hata fırlatmak yerine 10 döndürür.
Oturum ile çerez arasındaki fark nedir?
Bir çerez tarayıcıda saklanır ve her istekle gönderilir, bu yüzden ziyaretçi onu okuyabilir ve değiştirebilir. Bir oturum veriyi sunucuda saklar ve bir çerezde (PHPSESSID) yalnızca rastgele bir id tutar. Giriş yapmış kullanıcının id'si gibi güvenilmesi gereken her şeyi $_SESSION içine koyun; girişten sonra session_regenerate_id(true) çağırın. Kod oturumlar ve çerezler sayfasında.
SQL injection'ı nasıl önlersiniz?
SQL'i asla girdiyi birleştirerek oluşturmayın. Değerlerin sorgudan ayrı gönderilmesi için hazırlanmış ifadeler kullanın:
<?php
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();
Yer tutucular yalnızca değerler için çalışır. Tablo adları, sütun adları ve ASC/DESC SQL'e girmeden önce bir izin listesiyle kontrol edilmelidir. Bkz. PDO.
XSS'i nasıl önlersiniz?
Girdiyi değil çıktıyı kaçışlayın: HTML'e yazdırılan her değeri htmlspecialchars($value, ENT_QUOTES, 'UTF-8') ile sarın ya da bunu otomatik yapan bir şablon motoru kullanın (Twig, Blade). <script> içinde JSON_HEX_TAG ile json_encode() kullanın. İkinci bir katman olarak bir Content-Security-Policy başlığı ekleyin.
Parolalar nasıl saklanmalı?
password_hash($password, PASSWORD_DEFAULT) ile saklanmalı ve password_verify($password, $hash) ile kontrol edilmelidir. Bunlar hash'in içinde saklanan rastgele bir tuz ve bilerek seçilmiş bir maliyetle bcrypt (veya Argon2id) kullanır. md5() ve sha1() hızlı ve tuzsuz oldukları için parolalar için yanlıştır. Eski hash'leri yükseltmek için girişte password_needs_rehash() kullanın.
İleri seviye PHP mülakat soruları
Generator'lar nedir ve ne zaman kullanırsınız?
yield içeren bir fonksiyon, değerleri yalnızca istendiğinde birer birer üreten bir Generator döndürür. Bellekte bir dizi oluşturmadan büyük veya sonsuz bir dizi üzerinde dolaşmanızı sağlar:
Tipik kullanımlar büyük bir dosyayı satır satır okumak, veritabanı satırlarını akış halinde işlemek ve tembel işlem hatlarıdır. Generator'lar ayrıca anahtarları (yield $key => $value), devretmeyi (yield from) ve send() ile değer almayı destekler.
Closure'lar nedir ve use ne işe yarar?
Anonim bir fonksiyon (function () { ... }) bir Closure nesnesidir. use içinde listelemedikçe dış değişkenleri görmez; use değeri closure oluşturulduğu anda kopyalar, use (&$x) ise bunun yerine referansla yakalar. Ok fonksiyonları (fn ($x) => $x * $factor) dış değişkenleri otomatik olarak, değerle yakalar ve tek bir ifade içerir.
abstract, final ve readonly arasındaki fark nedir?
abstract örneklenemeyen bir sınıfı ya da bir alt sınıfın uygulaması gereken bir metodu işaretler. final bir metodu ezmeyi veya bir sınıfı genişletmeyi yasaklar. readonly (PHP 8.1) bir özelliği yalnızca bir kez, sınıfın içinden, genellikle yapıcıda yazılabilir yapar; PHP 8.2 her özelliğin readonly olduğu readonly sınıfları ekledi.
Composer nedir ve PSR-4 nedir?
Composer PHP'nin bağımlılık yöneticisidir: composer.json paketleri listeler, composer.lock tam sürümleri sabitler ve vendor/autoload.php her şeyi yükler. PSR-4 bir isim alanı önekini bir klasöre eşleyen otomatik yükleme standardıdır, böylece App\Mail\Mailer src/Mail/Mailer.php dosyasında yaşar ve ilk kullanımda yüklenir. install (kilit dosyasından) ile update (yeni sürümler, yeni kilit dosyası) farkını açıklayın.
PHP 8'de neler değişti?
Öne çıkan özellikler: 8.0'da adlandırılmış argümanlar, match, nullsafe operatörü ?->, union türler, yapıcı özellik yükseltme, attribute'lar, str_contains() ve daha mantıklı dizge ile sayı karşılaştırması; 8.1'de enum'lar, readonly özellikler, birinci sınıf çağrılabilir söz dizimi (strlen(...)) ve fiber'lar; 8.2'de readonly sınıflar ve bağımsız null/true/false türleri; 8.3'te türlü sınıf sabitleri, #[\Override] attribute'u ve json_validate(); 8.4'te property hook'lar, asimetrik görünürlük (public private(set)), array_find() ve sarmalayıcı parantez olmadan new Foo()->method(). Birçok fonksiyon da artık bir uyarıyla false döndürmek yerine TypeError veya ValueError fırlatır.
PHP belleği nasıl yönetir?
Her değerin bir referans sayısı vardır; sıfıra düştüğünde bellek hemen serbest bırakılır. Birbirine döngüsel olarak başvuran nesneler asla sıfıra ulaşmaz, bu yüzden olası döngü kökleri arabelleği dolduğunda (varsayılan 10.000 giriş) bir döngü toplayıcı çalışır ve onları serbest bırakır (gc_collect_cycles() onu isteğe bağlı çalıştırır). Diziler ve dizgeler yazınca kopyalanır (copy-on-write): $b = $a ataması biri değiştirilene kadar veriyi paylaşır. Her istek temiz başlayıp bittiği için bellek sızıntıları çoğunlukla uzun süre çalışan işçilerde ve kuyruk tüketicilerinde önemlidir.
PHP dizileri nasıl uygulanır?
Bir PHP dizisi sıralı bir hash haritasıdır: ekleme sırasını korur ve int veya string anahtarları değerlere eşler; aynı türün liste, sözlük ve yığın olarak hizmet etmesinin nedeni budur. Anahtar aramaları (isset($arr[$key])) ortalamada sabit süre alır, in_array() ise her değeri tarar. Tam sayıya benzeyen dizge anahtarlar dönüştürülür: $a['1'] ve $a[1] aynı elemandır.
Yaygın mülakat kodlama görevleri
Sık sık canlı olarak sorulan kısa alıştırmalar. Her fonksiyon yaygın bir yanıttır; onları çalıştırın, kendi girdilerinizi (boş bir tane dahil) ekleyin ve mülakatçının genellikle kontrol ettiği şey olan zaman karmaşıklığını açıklamaya hazır olun.
Sıkça Sorulan Sorular
Bir PHP geliştirici mülakatına nasıl hazırlanırım?
Temelleri bakmadan açıklayıp kodlayabildiğinizden emin olun: karşılaştırma ve türler, diziler ve fonksiyonları, OOP (arayüzler, soyut sınıflar, trait'ler, static), istisnalar ve güvenlik (hazırlanmış ifadeler, htmlspecialchars, password_hash). Sonra bir framework'ü (Laravel veya Symfony) ve Composer'ı, oluşturduğunuz bir projeyi anlatabilecek kadar iyi bilin.
Bir mülakat için hangi PHP sürümünü bilmeliyim?
PHP 8. Mülakatçılar 8.0 ile 8.3 arasında eklenen özellikleri bilmenizi bekler: adlandırılmış argümanlar, match, nullsafe operatörü ?->, union türler, yapıcı özellik yükseltme, enum'lar, readonly özellikler ve birinci sınıf çağrılabilir söz dizimi. PHP 7 davranışından yalnızca değiştiği yerlerde bahsedin, örneğin 0 == "a".
Yeni mezunlara hangi PHP soruları sorulur?
Çoğunlukla dilin temelleri: == ile ===, echo ile print, tek ile çift tırnak, isset ile empty, include ile require, GET ile POST, oturum ile çerez ve değerleri ters çevirme, süzme veya sayma gibi basit dizi görevleri. En az bir kısa kodlama alıştırması bekleyin.
Deneyimli geliştiricilere hangi PHP soruları sorulur?
Tasarım ve arka plandaki davranış: arayüz ile soyut sınıf, trait'ler, geç statik bağlama, referanslar, generator'lar ve bellek, istisnalar ve hata yönetimi, SQL injection ve işlemler, önbellekleme, Composer otomatik yükleme ve bir özelliği nasıl yapılandırıp test edeceğiniz. Yanıtların tanımlarla değil, artı ve eksileriyle gelmesi beklenir.