PHP undefined function hatası, kodun çağırdığı fonksiyonun mevcut çalışma ortamında çözümlenemediğini gösterir. Çözüm, fonksiyon adını ve namespace kullanımını kontrol etmekten başlayıp yerleşik fonksiyon veya eklenti durumunu, çalışma ortamını ve harici paket yüklemesini sırayla ayırmaya dayanır.
Aynı hata farklı nedenlerle oluşabildiği için yalnızca fonksiyon satırını tekrar yazmak yeterli olmayabilir. Önce çağrının gerçekten hangi fonksiyonu hedeflediğini belirlemek, ardından tanımın ve gerekli dosyaların ilgili ortamda kullanılabilir olup olmadığını kontrol etmek gerekir.
Bu hata ne anlama gelir ve teşhise nereden başlanır?
PHP bir fonksiyon çağrısıyla karşılaştığında fonksiyon adını çözümler ve çalıştırılabilir bir tanım arar. Bu tanım bulunamazsa Uncaught Error: Call to undefined function mesajı oluşur. Buradaki “undefined” ifadesi, fonksiyonun her durumda hiç var olmadığı anlamına gelmez. Fonksiyonun adı yanlış yazılmış, namespace nedeniyle farklı bir isim aranmış, gerekli eklenti etkinleştirilmemiş, harici paket yüklenmemiş ya da kod farklı bir PHP ortamında çalışıyor olabilir.
Teşhisi aşağıdaki kısa ağaçla ilerletebilirsin:
- Fonksiyon adı doğru mu? Eksik karakter, yanlış alt çizgi, hatalı yazım veya yanlış çağrı biçimi varsa ikinci bölüme, yazım ve namespace kontrolüne geç.
- Kod bir namespace içinde mi? Fonksiyonun bulunduğu namespace ile çağrıda kullanılan ad aynı değilse tam nitelikli fonksiyon adını veya
use functionyaklaşımını kontrol et. Bu da ikinci bölümün konusudur. - Fonksiyon yerleşik mi ve gerekli eklenti kullanılabilir mi? Çağrı bir PHP yerleşik fonksiyonuna dayanıyorsa ilgili fonksiyonun çalışma ortamında kullanılabilirliğini ve yapılandırmayı incele. Bu ayrım, üçüncü bölümde ele alınır.
- Fonksiyon harici bir pakete mi ait? Paket bağımlılıklarının kurulup kurulmadığını ve Composer yükleyicisinin dosyaya dahil edilip edilmediğini kontrol et. Bu durumda dördüncü bölüme yönel.
- CLI ile web sunucusu aynı ortamı mı kullanıyor? Terminalde çalışan kodun tarayıcıda, tarayıcıda çalışan kodun da terminalde aynı PHP yapılandırmasına sahip olduğu varsayılmamalıdır. Ortam farklarını beşinci bölümdeki yöntemle ayır.
Her kontrolün amacı hatayı rastgele değişikliklerle bastırmak değil, çağrının hangi aşamada çözülemediğini bulmaktır. Benzer hata ayıklama yaklaşımlarını incelemek için Berk Akademi blog arşivi içindeki teknik yazılardan yararlanabilirsin.
Yazım hatası ve namespace kaynaklı çağrıyı nasıl düzeltirsin?

İlk olarak fonksiyonun tanımındaki ad ile çağrıdaki adı karakter karakter karşılaştır. Eksik harfler, fazladan alt çizgiler, farklı kelime sıralaması veya fonksiyon yerine sınıf metodu çağırmaya çalışma aynı hataya yol açabilir. Ardından dosyanın başındaki namespace bildirimini ve çağrının bulunduğu namespace bağlamını kontrol et.
Namespace içindeki bir fonksiyonu açıkça çağırmanın en güvenli yollarından biri tam nitelikli addır. Aşağıdaki örnekte fonksiyon AppText namespace'i içinde tanımlanıyor ve başında ters bölü işareti bulunan tam adla çağrılıyor:
<?php
namespace AppText;
function selamla(): string
{
return 'Merhaba';
}
echo AppTextselamla();
Beklenen çıktı: Merhaba
Fonksiyonu aynı dosyada veya başka bir namespace içinde sık kullanacaksan use function AppTextselamla; satırıyla içeri aktarabilir, ardından selamla() biçiminde çağırabilirsin. Bu satırdaki namespace ve fonksiyon adı, tanımda kullanılan adla aynı olmalıdır.
Örneğin selamla() yerine selamlaa() yazmak ya da AppTextselamla() yerine farklı bir namespace belirtmek, sorunun yerleşik fonksiyon veya eklentiyle değil, yanlış ada yönelen çağrıyla ilgili olduğunu gösterir. Bu ayrım netleştiğinde yerleşik fonksiyon ve eklenti kontrolüne geçmek daha sağlıklı olur.
Fonksiyon yerleşik mi, eklenti etkin mi ve doğru yapılandırma mı kullanılıyor?

Hata mesajındaki fonksiyonun kaynağını önce ayır. strlen() gibi yerleşik fonksiyonlar PHP çalışma ortamında tanımlıdır. Bazı fonksiyonlar ise ilgili PHP eklentisi yüklendiğinde kullanılabilir. function_exists(), belirli bir fonksiyonun o çalışma anında tanımlı olup olmadığını kontrol eder.
<?php
if (function_exists('strlen')) {
echo strlen('abc'), PHP_EOL;
}
Beklenen çıktı: 3. strlen() bulunamıyorsa yazım hatasını, kullanılan PHP çalışma ortamını veya yapılandırmayı incelemelisin. Şüphe eklenti kaynaklı bir işleve aitse, fonksiyon adını function_exists() ile, eklentinin kendisini ise extension_loaded() ile kontrol edebilirsin. true sonucu fonksiyon adının tanımlı olduğunu gösterir; bazı işlevlerde yapılandırma veya derleme seçenekleri ayrıca önem taşıyabilir.
Komut satırında şu iki kontrol, kullanılan ortam hakkında hızlı bilgi verir:
php --ini
php -m
php --ini komutu yüklenen php.ini dosyasını ve taranan ek yapılandırma dizinlerini gösterir. php -m ise CLI sürecinin gördüğü PHP ve Zend modüllerini listeler. Listede beklediğin eklenti yoksa ilgili yapılandırmayı veya PHP kurulumunu incelemelisin.
Tarayıcıdan çalışan uygulama için aynı bilgiyi web isteği içinde de kontrol et. Geçici bir phpinfo() çıktısı, kullanılan php.ini dosyasını ve etkin yapılandırma ayrıntılarını gösterir. Daha dar kapsamlı bir tanı için yalnızca php_ini_loaded_file() ve extension_loaded() sonuçlarını yazdıran bir çıktı hazırlayabilirsin. CLI ile web sunucusu farklı PHP süreçleri veya yapılandırmaları kullanabileceğinden, yalnızca terminalde başarılı olan bir test web tarafındaki sonucu garanti etmez.
phpinfo() ayrıntılı yapılandırma bilgileri sunduğu için tanı tamamlandıktan sonra bu dosyayı kaldır veya yalnızca yetkili erişimine açık tut.
Harici paketlerde Composer ve vendor/autoload.php neden önemlidir?
Fonksiyon ya da sınıf bir harici paketten geliyorsa, yalnızca kodda çağrı yapmak yeterli değildir. Paket projeye eklenmeli, bağımlılıkları kurulmalı ve Composer tarafından oluşturulan otomatik yükleyici çalışma dosyasından çağrılmalıdır. Monolog için yeni bir bağımlılık ekleme komutu şöyledir:
composer require monolog/monolog
Mevcut bir projede composer.json ve composer.lock dosyaları zaten bulunuyorsa bağımlılıkları kurmak için composer install kullanılır. Composer, otomatik yükleme bilgisi bulunan paketler için vendor/autoload.php dosyasını üretir. Bu nedenle çalışma dosyasında şu satır yer almalıdır:
<?php
use MonologHandlerStreamHandler;
use MonologLevel;
use MonologLogger;
require __DIR__ . '/vendor/autoload.php';
$logger = new Logger('app');
$logger->pushHandler(
new StreamHandler(__DIR__ . '/app.log', Level::Warning)
);
$logger->warning('İlk log kaydı');
echo 'Log kaydı oluşturuldu.' . PHP_EOL;
Beklenen standart çıktı Log kaydı oluşturuldu. olur. MonologLogger, MonologHandlerStreamHandler ve MonologLevel sınıflarının kullanılabilmesi vendor/autoload.php dosyasının doğru yoldan yüklenmesine bağlıdır. app.log dosyasının gerçekten yazılması ise hedef klasörün mevcut olmasına ve PHP sürecinin yazma izinlerine bağlıdır.
Composer otomatik yükleyicisi, PHP eklentilerini etkinleştirmez. Hata eklenti tarafından sağlanan bir işleve aitse önce PHP yapılandırmasını ve etkin modülleri, harici sınıf veya paket kaynaklıysa Composer bağımlılıklarını kontrol etmelisin.
CLI, web sunucusu ve proje dizini farklarını nasıl ayırırsın?
Aynı dosya terminalde çalışıp tarayıcıda undefined function hatası veriyorsa sorun yalnızca kodda olmayabilir. Terminaldeki PHP ikilisi ile web sunucusunun kullandığı PHP ortamı; SAPI, php.ini, etkin eklentiler, çalışma dizini ve proje kökü bakımından farklı olabilir.
<?php
$base = __DIR__;
$autoload = $base . '/vendor/autoload.php';
$status = 'bulunamadı';
if (is_file($autoload)) {
require $autoload;
$status = 'yüklendi';
}
printf(
"SAPI: %snINI: %snÇalışma dizini: %snDosya dizini: %snautoload: %sn",
PHP_SAPI,
php_ini_loaded_file() ?: 'yüklenmedi',
getcwd() ?: 'belirlenemedi',
$base,
$status
);
Beklenen çıktı, çalıştırma ortamının SAPI değerini, kullanılan php.ini dosyasını, çalışma ve dosya dizinlerini, ayrıca autoload dosyasının durumunu gösterir. __DIR__, yolu bu PHP dosyasının bulunduğu dizine bağlar. Dosya proje kökünde değilse vendor yolunu gerçek proje köküne göre kurmalısın. Composer, yanlış yolu veya eksik yükleme sırasını kendiliğinden düzeltmez.
- Kontrol: Fonksiyon adını ve yazımını doğrula; gerekirse
function_exists()ile test et.
Ayırdığı kök neden: Yanlış fonksiyon adı, eksik parantez veya farklı bir fonksiyonun çağrılması. - Kontrol: Dosyanın namespace bildirimini,
use functionsatırını ve fonksiyonun tam adını karşılaştır.
Ayırdığı kök neden: Kısa adın yanlış namespace içinde aranması veya global fonksiyon yerine namespaced bir fonksiyonun çağrılması. - Kontrol: Fonksiyonun PHP ile gelen bir yerleşik fonksiyon mu, yoksa eklentiye bağlı bir fonksiyon mu olduğunu ayır.
Ayırdığı kök neden: Eklenti gerektiren bir fonksiyonun, eklenti etkin olmadan çağrılması. - Kontrol:
php_ini_loaded_file()ile kullanılan yapılandırmayı,extension_loaded('eklenti_adi')ile etkin modülü kontrol et.
Ayırdığı kök neden: CLI ve web sunucusunun farklıphp.inidosyaları veya farklı etkin eklentiler kullanması. - Kontrol: Dosyayı terminalde ve tarayıcıda çalıştırarak PHP ikilisini, SAPI değerini, yapılandırmayı, etkin modülleri ve çalışma dizinini karşılaştır.
Ayırdığı kök neden: Terminaldeki PHP kurulumu ile web sunucusunun çalıştırdığı PHP ortamının farklı olması. - Kontrol: Composer paketinin proje içinde bulunduğunu,
vendor/autoload.phpyolunun doğru olduğunu ve autoload dosyasının çağrıdan önce yüklendiğini doğrula.
Ayırdığı kök neden: Yanlış proje kökü, bulunamayanvendordizini, eksikrequireadımı veya paketin fonksiyonunun farklı bir tam adla sunulması. - Kontrol: Önce yukarıdaki gibi minimal bir PHP dosyasını çalıştır, ardından aynı yükleme sırasını uygulamanın giriş dosyasıyla karşılaştır.
Ayırdığı kök neden: Minimal dosya çalışırken uygulama hata veriyorsa sorun uygulamaya özgü koşullu yükleme, namespace düzeni veya çağrı sırasındadır.
Bu kontrolün yanında programlama ve algoritmik düşünme temellerini farklı testlerle değerlendirmek isteyenler için bilgi testleri merkezi yararlı bir başlangıç noktası olabilir.
Sık Sorulan Sorular
function_exists() ile undefined function hatası nasıl test edilir?
function_exists('fonksiyon_adi') ifadesiyle fonksiyonun mevcut olup olmadığını kontrol edebilirsin. Sonuç false ise yazım, namespace, eklenti veya yükleme sırasını incele. true olduğu hâlde hata sürüyorsa fonksiyonun tam adını ve çalışma ortamını karşılaştır.
Namespace içindeki bir PHP fonksiyonu nasıl çağrılır?
Fonksiyonu tam adıyla, örneğin AppYardimcidonustur() şeklinde çağırabilir veya use function AppYardimcidonustur; satırıyla kısa adını kullanabilirsin. Namespace bildirimi ile çağrıda kullanılan ad aynı yapıyı göstermelidir.
Terminalde çalışan PHP fonksiyonu web sunucusunda neden bulunamayabilir?
Terminal ve web sunucusu farklı PHP ikilisi, SAPI, php.ini, etkin eklentiler veya proje çalışma dizini kullanabilir. Bu nedenle bir ortamda bulunan yerleşik ya da eklentiye bağlı fonksiyon diğer ortamda tanınmayabilir.
vendor/autoload.php dosyası neden yüklenmez veya bulunamaz?
Göreli yol yanlış proje kökünü gösteriyor, vendor dizini farklı yerde bulunuyor veya require adımı çalışmıyor olabilir. __DIR__ . '/vendor/autoload.php' ile yolu dosyanın konumuna bağla. Dosya yüklendiği hâlde fonksiyon bulunmuyorsa paketin autoload tanımını ve fonksiyonun tam adını ayrıca incele.
Bu ayrım sırası, hatayı tek bir nedene bağlamak yerine kodu, namespace'i, PHP ortamını, eklentileri ve proje yükleme düzenini ayrı ayrı sınamana yardımcı olur.