If you want to avoid a fatal error when an undefined method call fails, you can add a simple Exception thrower like this:
<?php
class MyClass
{
// ...lots of your regular code, then:
public function __call($name, $args)
{
throw new Exception('Undefined method ' . $name . '() called');
}
}
?>
This means your top-level code can simple run inside a
<?php try { call_a_method(); } catch (Exception $e) { handle_exception($e); } ?>
block, and catch the errors that were fatal before.
Çalışma Anı Yapılandırması
Bu işlevlerin davranışı php.ini içindeki ayarlardan etkilenir.
| İsim | Öntanımlı | Değişiklik Yeri | Sürüm Bilgisi |
|---|---|---|---|
| error_reporting | NULL | PHP_INI_ALL | |
| display_errors | "1" | PHP_INI_ALL | |
| display_startup_errors | "0" | PHP_INI_ALL | |
| log_errors | "0" | PHP_INI_ALL | |
| log_errors_max_len | "1024" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| ignore_repeated_errors | "0" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| ignore_repeated_source | "0" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| report_memleaks | "1" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| track_errors | "0" | PHP_INI_ALL | |
| html_errors | "1" | PHP_INI_ALL | PHP <= 4.2.3'te PHP_INI_SYSTEM. |
| xmlrpc_errors | "0" | PHP_INI_SYSTEM | PHP 4.1.0'dan beri kullanılabilmektedir. |
| xmlrpc_error_number | "0" | PHP_INI_ALL | PHP 4.1.0'dan beri kullanılabilmektedir. |
| docref_root | "" | PHP_INI_ALL | PHP 4.3.0'dan beri kullanılabilmektedir. |
| docref_ext | "" | PHP_INI_ALL | since PHP 4.3.2'den beri kullanılabilmektedir. |
| error_prepend_string | NULL | PHP_INI_ALL | |
| error_append_string | NULL | PHP_INI_ALL | |
| error_log | NULL | PHP_INI_ALL |
Yapılandırma yönergelerinin kısa açıklamalarını aşağıda bulabilirsiniz.
-
error_reportinginteger -
Hata raporlama seviyesini tanımlar. Değiştirge olarak ya bir bit alanını ifade eden bir tamsayı ya da isimli sabitler verilebilir. Hata raporlama seviyeleri ve sabitleri Öntanımlı Sabitler sayfasında ve php.ini içinde açıklanmıştır. Hata raporlama seviyesini çalışma anında belirtmek için error_reporting() işlevini kullanabilirsiniz. Ayrıca, display_errors yönergesine de bakınız.
PHP 4 ve PHP 5'te öntanımlı değer
E_ALL& ~E_NOTICEolup bu ayarlaE_NOTICEseviyesindeki hatalar gösterilmez. Betiğinizi geliştirirken onları da görmek isteyebilirsiniz.Bilginize:
E_NOTICEseviyesindeki hataların geliştirme aşamasında gösterilmesinin bazı yararları vardır. Hata ayıklama amacıyla kullanıldığındaE_NOTICEiletileri kodunuzdaki olası hatalar hakkında sizi uyarır. Örneğin atanmamış değerlerin kullanımı hakkında bir uyarı alırsınız. Özellikle yazım hatalarını bulmakta yardımcı olarak hata ayıklamakla zaman kaybetmekten sizi kurtarır.E_NOTICEiletileri kötü yazım tarzı için de sizi uyarır. Örneğin, PHP "item" indisini bir sabit olarak ele almayı deneyeceğinden $arr[item] yerine $arr['item'] yazmak daha iyidir. Belirttiğiniz indis bir sabit değilse PHP bunu dizinin bir anahtarı (dizgesel indisi) olarak kabul edecektir.Bilginize:
PHP 5'te
E_STRICTyeni bir hata seviyesi olarak devreye girmiştir.E_ALLile birlikte açıkça belirtilmedikçeE_STRICTseviyesinden hata raporları etkin olmayacaktır.E_STRICTseviyesinden hataların geliştirme aşamasında gösterilmesinin bazı yararları vardır. Bu iletiler, en son ve en çok önerilen kodlama yöntemini kullanmanız için size yardımcı olacaktır. Örneğin, kullanımı artık önerilmeyen işlevler hakkında uyarılacaksınız.Bilginize: PHP dışında PHP sabitleri
httpd.conf gibi PHP dışı yerlerde PHP sabitlerini kullanmak isterseniz, bunların tamsayı değerlerini kullanmak zorunda kalmak anlamlarını anlamayı zorlaştırdığı için elverişli olmayacaktır. Zamanla başka hata seviyeleri ekleneceğinden azami değer de (
E_ALLdeğeri) değişecektir. Bu bakımdanE_ALLyerine şimdiki ve gelecekteki tüm bit alanlarını kapsamak üzere 2147483647 gibi büyük bir değer kullanabilirsiniz (E_ALL'dan başka tüm hataları da içerir). -
display_errorsstring -
Hataların çıktının bir parçası olarak ekrana basılıp basılmayacağını veya bunların kullanıcıdan gizlenip gizlenmeyeceğini belirler.
"stderr" değeri hataları stdout (standart çıktı) yerine stderr'e (standart hataya) gönderir. Bu değer PHP'nin 5.2.4 sürümünden beri kullanılabilmektedir. Eski sürümlerde bu yönerge sadece boolean türünde değer kabul ederdi.
Bilginize:
Bu özellik sizi geliştirme aşamasında desteklemek amacıyla konmuştur ve kullanıcıya yönelik işlemler için asla kullanılmamalıdır.
Bilginize:
Bu yönergeye çalışma anında ( ini_set() ile) değer atanabilse de, eğer betik ölümcül bir hataya sahipse bunun herhangi bir etkisi olmayacaktır. Bunun sebebi çalışma anında istenen eylemin yerine getirilmeyecek olmasıdır.
-
display_startup_errorsboolean -
display_errors etkin olsa bile PHP ilk başlatılırken oluşan hatalar gösterilmez. Hata ayıklamıyorsanız display_startup_errors yönergesinin değerini off olarak bırakın.
-
log_errorsboolean -
Betiğin hata iletilerinin sunucunun hata günlüğüne veya error_log ile belirtilen dosyaya kaydedilip kaydedilmeyeceğini belirler. Bu seçenek sunucuya özgüdür.
Bilginize:
Sitenizde hataları kullanıcıya göstermek yerine hata günlüklerine kaydetmenizi hararetle tavsiye ederiz.
-
log_errors_max_leninteger -
Hata günlüğü iletilerinin azami uzunluğunu bayt cinsinden belirlemek için kullanılır. Kaynak hakkındaki error_log bilgisi buna eklenir. 1024 öntanımlı değer olup, 0 belirtildiği takdirde hata günlüğü iletilerininin uzunlukları sınırlanmaz. Bu uzunluk günlüğe kaydedilen ve gösterilen hata iletilerinden başka $php_errormsg iletilerine de uygulanır.
integer türünde bir değer kullanıldığında değer baytların sayısıdır. Büyük bayt değerleri için kullanılabilecek birimlerin gösterimleri hakkında bilgiyi bu SSS altında bulabilirsiniz. -
ignore_repeated_errorsboolean -
Yinelenen hata iletileri günlüğe kaydedilmez. ignore_repeated_source yönergesinin değeri true olmadıkça yinelenen hataların aynı dosyanın aynı satırında oluşması gerekir.
-
ignore_repeated_sourceboolean -
Yinelenen iletiler yok sayılırken ileti kaynağının da yoksayılmasını sağlar. Bu yönergenin değeri On olduğu takdirde, farklı dosyalardan veya farklı satırlardan kaynaklanan yinelenmiş iletileri hata günlüklerine kaydedemezsiniz.
-
report_memleaksboolean -
Bu yönergenin değeri Off olduğu takdirde, bellek sızıntıları (stdout'ta veya günlük dosyasında) gösterilmez. Bu sadece, hata ayıklama derlemesinde ve error_reporting yönergesinde
E_WARNINGlisteye dahil edilmişse etkilidir. -
track_errorsboolean -
Bu yönergenin değeri On olduğu takdirde, son hata iletisi daima $php_errormsg değişkenine atanır.
-
html_errorsboolean -
Hata iletilerine HTML etiketleri dahil edilmez. Yeni HTML hataları biçeminde, doğrudan kullanıcıyı hatayı veya hataya sebep olan işlemi açıklayan bir sayfaya yönlendiren tıklanabilir hatalar üretilir. Bu gönderimler docref_root ve docref_ext yönergelerinden etkilenir.
-
xmlrpc_errorsboolean -
Normal hata raporlaması kapatılıp, hatalar XML-RPC hata iletileri olarak biçemlenir.
-
xmlrpc_error_numberinteger -
XML-RPC hata dizisinin faultCode elemanının değeri olarak bu değer kullanılır (bkz. xmlrpc_is_fault()).
-
docref_rootstring -
Yeni hata biçemi, hatayı veya hataya sebep olan işlemi açıklayan bir sayfaya bir gönderim içerir. Bu gönderimin bir kılavuz sayfasına yönlendirmesi durumunda, kılavuzun dilinizdeki çevirisini indirebilir ve bu yerel kopyanın bulunduğu yeri bu yönergede belirtebilirsiniz. Örneğin, kılavuzun yerel kopyasına "/manual/" ile erişilebiliyorsa bunu
docref_root=/manual/şeklinde belirtebilirsiniz. Buna ek olarak, kopyanızın dosya uzantısını docref_ext yönergesinde belirtebilirsiniz (örnek:docref_ext=.html). Harici kaynaklara gönderimler de mümkündür. Örnekler:docref_root=http://manual/en/veyadocref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"Bazı durumlarda docref_root değerinin sonuna bir bölü çizgisi "/" eklemeniz gerekebilir. Fakat yukarıdaki ikinci örnekteki gibi bir durumda buna asla gerek yoktur.
Bilginize:
Bu özellik, bir işlevin açıklamasına bakmayı kolaylaştırması nedeniyle daha ziyade geliştirme aşamasında kullanmanız için tasarlanmıştır. Hataları son kullanıcıya göstermek amacıyla kullanılmamalıdır.
-
docref_extstring -
docref_root yönergesine bakınız.
Bilginize:
docref_ext değeri bir nokta "." ile başlamalıdır.
-
error_prepend_stringstring -
Bir hata iletisinden önce çıktılanacak dizge.
-
error_append_stringstring -
Bir hata iletisinden sonra çıktılanacak dizge.
-
error_logstring -
Hataların kaydedileceği dosyanın adı. Dosya, HTTP sunucunun kullanıcısı tarafından yazılabilir olmalıdır. Eğer syslog özel değeri kullanılmışsa hatalar bir dosya yerine sistemin hata günlüğüne gönderilir (Unix'te syslog(3), Windows NT'de olay günlüğü). Windows 95'te sistem günlükçüsü desteği yoktur. Ayrıca, syslog() işlevine de bakınız. Yönerge tanımsız bırakılmışsa hatalar SAPI hata günlükçüsüne gönderilir. Örneğin bu, Apache'nin hata günlüğü veya CLI için stderr olabilir.
Do NOT call session_start() before you call error_reporting();
<?php
// does NOT work correctly
session_start();
error_reporting(NULL);
// does work
error_reporting(NULL);
session_start();
?>
There is a more simple and more correct solution - to use file .htaccess, where you can simply add the following lines:
php_value display_errors 1
php_value display_startup_errors 1
Using
<?php ini_set('display_errors', 1); ?>
at the top of your script will not catch any parse errors. A missing ")" or ";" will still lead to a blank page.
This is because the entire script is parsed before any of it is executed. If you are unable to change php.ini and set
display_errors On
then there is a possible solution suggested under error_reporting:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("file_with_errors.php");
?>
When using PHP with Apache mod_fcgid and "log_errors = On", PHP errors get logged into Apache ErrorLog file with severity "warn". No matter what severity the PHP error itself has, the severity in the Apache log is "warn".
To log PHP errors in the Apache log, use:
LogLevel warn
(or debug, info, notice)
Note that if error_log is empty, errors/warnings/notices will be written to stderr (standard error stream), and this may be a problem if you is PHP in CLI.
<?php
# test.php
error_reporting(E_ALL);
ini_set('display_errors','On');
ini_set('error_log','my_file.log');
foreach(1 as $i);
ini_set('error_log','');
foreach(1 as $i);
ini_set('error_log','/dev/null'); #linux
foreach(1 as $i);
?>
php -f test.php
will output :
<?
Warning: Invalid argument supplied for foreach() in /test.php on line 7 # stdout
PHP Warning: Invalid argument supplied for foreach() in /test.php on line 10 # stderr
Warning: Invalid argument supplied for foreach() in /test.php on line 10 # stdout
Warning: Invalid argument supplied for foreach() in /test.php on line 13 # stdout
?>
Errors displayed in the stdout (standard output stream) car be catched with the output buffering functions (ob_start/ob_get_clean) while strerr cannot.
