Бірнеше «исключение-қателік» бағдарлама тілдерінде әдеттегімен не болса, нәтеже не ісек, исключение табылар. Бұл шешімге келеді, бірақ PHP бір «исключение-лайт» бағдарлама тілі. Оныда исключионалар бар және объектермен жұмыс істейтін уақытта, PHP көзіндегі көптеген қызметтер не болса, несізді жасауға жататыні жатпай жұмыс істеу үшін тырысып көріп тұрады.
Мысалы:
$ php -a
php > echo $foo;
Notice: Undefined variable: foo in php shell code on line 1
Бұл тек ескерту қателігі, және PHP бастапқыда бой жатқызбаулы жататын жатай тұрады. Бұл Python сияқты «исключение-толық» тілдерден келгендерге қиын болуы мүмкін, себебі мысалы, Python’da өзіндік ұсыныссыз өтінішке сілтеу қосымшасы бар:
$ python
>>> print foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
Тек себебі Python кішкентай мәселені де көрсете отырар, сондықтан көмекшілерге барлық мүмкін қиындықтарды немесе қиындықтарды бағаламайтындай болуы үшін, не болмаса, несіз өте бейімді болып табылуы мүмкін, сондықтан PHP келеді жатқані жататын жататын айтар ала ма? сонда ол осында жататынты ұсынады және оны тіркеу.
PHP-де қателіктілік дәрежелері бірнеше бар. Ерекше тізімдегі ең көп пайдаланылатын хабарлардың үшін қателіктер, ескертулер мен кеңестер бар. Олардың дәрежелері дайындылығы бар: E_ERROR
, E_NOTICE
және E_WARNING
. Қателіктер - бұл фаталды орындайтын қателіктер, адамдардың кодындағы қателіктер менің кодымды түзетуім көмек көрсетеді, себебі олар PHP-ды жаттығу үстіне тұратындарын қастайды. Ескертпелер - бұл скриптты орындау кезінде мәселелерге көмек көрсете алатын назар ақпараттары. Ескертпелер - өлімге арналмайды, скриптты орындау тоқтатылмайды.
Сертіктікке байланысты екінші уақытта хабарланатын қателіктер де бар: E_STRICT
хабарлар. Бұл хабарлар, кодыңызды жақсарту үшін пайдаланылады және келесі PHP нұсқаларымен ең көмекші болу үшін реттелген айырбастауларды сұрау етеді.
Қателіктерді дайындау PHP баптаулары мен/немесе PHP функцияларын пайдалану арқылы жасалуы мүмкін. Оны қолдану арқылы PHP функциясы error_reporting()
сценарийдің жүргізілетін уақытында қателіктердің дәрежесін белгілеу үшін пайдаланылар санаттарын бірін қалпына келтіру арқылы көрсете аласыз. Мысалы, тек қателіктер мен кеңестерді көру үшін, бірақ ескертуді көрмейді ме? деген болмаса, бұл сізге келеді:
<?php
error_reporting(E_ERROR | E_WARNING);
Сіз өзіңіздің қателіктерді экранға көрсетуінізді (даму үшін жақсы) немесе жасыруын, және журналдауын (әзірлік үшін жақсы) басқару мүмкін. Бұны байқау жасау үшін Қателіктерді Дайындау бөлімін қарауға шолу көрсетіңіз.
Сіз PHP-ге таңбалаушыны @
Қателік Контроллер Операторы арқылы белгілі қателіктерді жоюды атайын айтасыздайсыз. Сіз бұл операторды бір шығыстықтың басында қолданасыз, мен тым өршілдігі бар көзінегі дайындаған көзінен келетін қате сәбыз болса, онда бұл қате жоққа түскен.
<?php
echo @$foo['bar'];
Егер ол өткен болса, бұл $foo['bar']
шығаратын болады, бірақ $foo
немесе 'bar'
кілті жоқ болса, тек нөлді беретініп, еш нөсерді табатын жоғарып баспасыздырар. @
қателік контроллер операторынан бас тартпасақ, бұл шығатын мәтін PHP Өзгерту: Анықталмады айнымалы: foo
немесе PHP Өзгерту: Анықталмады индекс: bar
қатесін жасау мүмкін.
Бұл жаттығу ідея сияқты көрінуі мүмкін, бірақ бірнеше қажетсіз жасалуларды тарту керек. PHP қателіктердін @
арқылы жою жасау операторынан көмекші шығататын жолаушыды қолданады. Егер бірақ қателік контроллер операторынан өтіп көрсеңіз, бұл мәтінді қатесіз болдырмау жоспарын жаттайды. Маған көмек көрсеңіз, күшке толық жатамасыз жасаулар толығымен жасалған жатасыз тұтас жоспарына түседі.
Бірақ бұл бірнеше өршілдіктерге ие болуы мүмкін. PHP @
бар қателік контроллер операторымен индикаторлайды, дайындаған көзді түсіргенде ол түпнұсқа іске асырады. Алдымнан оптимизация өткені, барлық бағдарлама/кітап үшін, адамдар сервер тауарындағы қателік контроллер операторының жұмыс жасау ерекшеліктерін түсіну маңызды.
Екіншінше, қателік контроллер операторы толық қателікті алып тастайды. Қате көрсетілмейді және қатені журналга жібермейді. Сонымен қатар, өзінің көреді мұндай келген қатенің зиянсыз болуы мүмкін, бірақ басқа, аз зиянды қате туралы білген жатататын болмайды.
Егер қате жою операторын қолдану жолы бар болса, онда оны қолдану керек екенін қарастырыңыз. Мысалы, біздің жоғарғы кодты бұл жағымды жаза алатын:
<?php
// Null Coalescing Operator
echo $foo['bar'] ?? '';
fopen()
файлды табу үшін көмекші болмауы мүмкін болады. Сіз файлды табатындарды тексеруі боларында файлды табауын тырысып аларсыз, содан кейін fopen()
(бұл мұндай болуы мүмкін деп ойласа бермеуі көп, бірақ ол жатасыз бола алады) оқып алар. Бұл белгісіздік бола алады. Бұлды PHP шешуі көмекші болуы мүмкін, бірақ бұл қатесізді жасау тәуелділікті артуып кетуі мүмкін кездеседі.
Елді тизбегінде, біз бір стандартты PHP жүйесінде қателіктерді ажыратуды әлдеуі жоқ деп айттық. Бірақ Xdebug басқармасында xdebug.scream
іске асырайтын параметр бар. Сіз бұны php.ini
файлы арқылы қазірлауыз.
xdebug.scream = On
Сіз бұл өрісті ini_set
функциясы арқылы ойластыра аласыз.
<?php
ini_set('xdebug.scream', '1')
Бұл көмекші кодты бағдарлама жасауда және анықтамалы қате босатпауда өте пайдалы болады. Көмекші кодты ажыратпау үшін ешкімні қоңырау қылмауыз, сонымен қатар, қателік контроллер операторы ажыратпау жолаушы.
PHP-ді “exception-heavy” программалау тілі болуы мүмкін, тек кейбір қатарлы строчканы ауыстыру үшін көмек көрсетеді. Ал егер сіздің “қателіктеріңізді” “exceptions” ретінде ауыстыру келсе, сонда ErrorException
сыныбын пайдалануға болады, онда Exception
сыныбын кеңейтуге болады.
Бұл бір көптеген қазіргі жасалған фреймворктердің (мысалы, Symfony және Laravel) өзгертудің жалпы әдісіді байланыстырады. Дебаг режимінде (немесе девелопмент режимінде) , бұл фреймворктердің екеуі де өзіндік stack trace көрсетеді.
Салыстыру үшін көмек көрсету және қателіктерді жинау үшін көмекші пакеттерді де пайдалануға болады. Мысалы, Whoops! , мысалы, Laravel-ды дефолтты орнатушысы болып табылады және барлық фреймворктерде пайдалануға болады.
Девелопмент кезінде қателіктерді “exceptions” ретінде шығару арқылы, сіз оларды деңгеймен жасауға болады, және девелопмент кезінде көруші кезінде оларды “catch” аймақты таратуымен бірнеше өтініштермен белгіленген бола аласыз. Сіздің қалыпты тұлғаларыңызды қамтамасыз ететін күйге келтіруге әр бір қате бірнеше күн көп мүмкіндік жасайды.
Бұл жайлы ақпарат және ErrorException
сыныбын қалай пайдалануға болатыны туралы толық ақпарат ErrorException Class бетінде табылуы мүмкін.
error_reporting()
Қателіктер қауіпті бірдеңе әуес зерттеу тілдерінің белгілі бөлігі, бірақ олар көпшілігі PHP программистері таңмайды. Ruby сияқты тілдер көпшілігі дайын болмауы тиіс, сондықтан HTTP сұрауы сәтсіз болғанда, немесе DB сұрауы бұзылғанда, немесе сурет дайын болмаса, Ruby (немесе қолданылатын жемдер) экранға қателік шығарады, себебі сізге тиіс белгіліде айтылады.
PHP және қалыптасқан CodeIgniter кезінде көптеген тиімді қателіктерді көрсету үшін асымын болады, file_get_contents()
қоңырауынан көбінесе FALSE
және кеңістік болар жатамайды. Мол, сізге қателіктерді көру үшін жасалған класс туралы қателік өтінімінде немесе бұғаттамада жолау көздерінде get_error()
әдісті пайдалануға болады. Сұрау осы жасалған қате туралы толық белгіліде болмайды және қандай қате өтінімі болатынын тексеру үшін документті іздейтініз.
Біреу басқа класстар экранға қателік шығарып және процесті шығарып тастайды деп есептесе, басқа өрісте қателікті динамик ретте өңдеу мүмкіндігін тоқтатасыздар. Қателіктерді дайын көзі көргізу үшін шығарылады. Егер сізде қате шығарса, сіз оны өздігінше қалай тұтыну көзіңізге алатыныз. Мысалы:
<?php
$email = new Fuel\Email;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');
try
{
$email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
// Валидация сәтсіз болды
}
catch(Fuel\Email\SendingFailedException $e)
{
// Драйвер пошта жіберу мүмкін болмады
}
finally
{
// Қателік шығарылса да, емес, нормалды өңделу жалғауы басталған кейде орындалады
}
Жалпы Exception
классы өрісшілерге дайындаушы байланысты көмек көрсетпейді; бірақ бұлды бас тарту үшін үздік Exception
түрін өзгерту мүмкін:
<?php
class ValidationException extends Exception {}
Бұлды бірнеше кездесу блоктарын қоса аласыз және кез келген қателіктерді басқа басқаруыңыздың болуы мүмкін. Бұл, SPL кеши қамтамасыз ету арқылы төмендегі қателіктерді пайдалану жолдарында көмек көрсетуі мүмкін:
Мысалы, __call()
Мағиялы Методты пайдалану жасаулы болмаса, төмендегі кодды пайдалана аласыз:
throw new BadMethodCallException;