මෙය සිදුවන්නේ ඇයි?
කාලයාගේ ඇවෑමෙන්, PHP වඩාත් ආරක්ෂිත කේන්ද්රීය භාෂාවක් බවට පත්ව ඇත. පෙරනිමියෙන් අක්රිය කිරීමට භාවිතා කළ සැකසුම් දැන් පෙරනිමියෙන් සක්රිය කර ඇත. මේ සඳහා කදිම නිදසුනක් නම් E_STRICT
, එය පෙරනිමියෙන් PHP 5.4.0 ලෙස සක්රිය කර ඇත .
තවද, PHP ප්රලේඛනයට අනුව, පෙරනිමියෙන්, E_NOTICE
php.ini හි අක්රීය කර ඇත. නිදොස් කිරීමේ අරමුණු සඳහා එය සක්රිය කිරීමට PHP ලියකියවිලි නිර්දේශ කරයි . කෙසේ වෙතත්, මම උබුන්ටු ගබඩාවෙන් සහ බිට්නාමිගේ වින්ඩෝස් තොගයෙන් PHP බාගත කරන විට - මට වෙනත් දෙයක් පෙනේ.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting
පෙරනිමියෙන් නිෂ්පාදන අගයට සැබවින්ම සකසා ඇති බව සලකන්න , පෙරනිමියෙන් "පෙරනිමි" අගයට නොවේ. මෙය තරමක් අවුල් සහගත වන අතර එය php.ini ට පිටින් ලේඛනගත කර නොමැත , එබැවින් වෙනත් බෙදාහැරීම් වලදී මම මෙය වලංගු කර නොමැත .
කෙසේ වෙතත්, ඔබේ ප්රශ්නයට පිළිතුරු සැපයීම සඳහා, මෙම දෝෂය මීට පෙර උත්පතන නොවූ විට දැන් මතු වේ:
ඔබ PHP ස්ථාපනය කර ඇති අතර නව පෙරනිමි සැකසුම් තරමක් දුර්වල ලෙස ලේඛනගත කර ඇති නමුත් බැහැර නොකරන්න E_NOTICE
.
E_NOTICE
නිර්වචනය නොකළ විචල්යයන් සහ නිර්වචනය නොකළ දර්ශක වැනි අනතුරු ඇඟවීම් ඇත්ත වශයෙන්ම ඔබේ කේතය පිරිසිදු හා ආරක්ෂිත කිරීමට උපකාරී වේ. මට ඔබට පැවසිය හැකිය, මීට වසර ගණනාවකට පෙර, E_NOTICE
සක්රීයව තබා ගැනීම මගේ විචල්යයන් ප්රකාශ කිරීමට බල කළ බව. එය C ඉගෙනීම පහසු කරවන අතර විචල්යයන් ප්රකාශ නොකිරීම කරදරයකට වඩා විශාලය.
මට ඒ ගැන කුමක් කළ හැකිද?
අක්රිය කරන්න E_NOTICE
ඇති "පෙරනිමි අගය" පිටපත් කිරීම මගින් E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
සහ සංඥ සමාන පසු දැනට uncommented දේ ඒ වෙනුවට error_reporting =
. CGI හෝ FPM භාවිතා කරන්නේ නම් Apache හෝ PHP නැවත ආරම්භ කරන්න. ඔබ "නිවැරදි" php.ini සංස්කරණය කරන බවට වග බලා ගන්න. නිවැරදි දෙය නම් ඔබ Apache සමඟ PHP ධාවනය කරන්නේ නම්, PHP-FPM ධාවනය කරන්නේ නම් fpm හෝ php-fpm, PHP-CGI ධාවනය කරන්නේ නම් cgi යනාදියයි. මෙය නිර්දේශිත ක්රමය නොවේ, නමුත් ඔබට උරුම කේතය තිබේ නම් සංස්කරණය කිරීම අතිශයින් දුෂ්කර වනු ඇත, එවිට එය ඔබගේ හොඳම ඔට්ටුව විය හැකිය.
E_NOTICE
ගොනුව හෝ ෆෝල්ඩර මට්ටම අක්රිය කරන්න . ඔබට යම්කිසි උරුම කේතයක් ඇති නමුත් වෙනත් ආකාරයකින් “නිවැරදි” ආකාරයට දේවල් කිරීමට අවශ්ය නම් මෙය වඩාත් සුදුසු වේ. මෙය සිදු කිරීම සඳහා, ඔබ Apache2, Nginx හෝ ඔබේ අභිමත සේවාදායකය කුමක් හෝ විමසිය යුතුය. Apache හි, ඔබ php_value
ඇතුළත භාවිතා කරනු ඇත <Directory>
.
පිරිසිදු වීමට ඔබේ කේතය නැවත ලියන්න. නිෂ්පාදන පරිසරයකට යන අතරතුර ඔබට මෙය කිරීමට අවශ්ය නම් හෝ ඔබේ දෝෂ කිසිවෙකු දැකීමට අකමැති නම්, ඔබ කිසියම් දෝෂයක් අක්රීය කර ඇති බවට වග බලා ගන්න, ඔබේ දෝෂ පමණක් සටහන් කරන්න (බලන්න display_errors
සහ log_errors
php.ini සහ ඔබේ සේවාදායක සැකසුම් තුළ) .
3 වන විකල්පය මත පුළුල් කිරීම සඳහා: මෙය වඩාත් සුදුසු වේ. ඔබට මෙම මාර්ගයට යා හැකි නම්, ඔබ යා යුතුය. ඔබ මුලින් මෙම මාර්ගයේ නොයන්නේ නම්, සංවර්ධන පරිසරයක් තුළ ඔබේ කේතය පරීක්ෂා කිරීමෙන් මෙම මාර්ගය අවසානයේ ගෙනයාම ගැන සලකා බලන්න. ඔබ එය බලන විට, මිදෙන්නට ~E_STRICT
හා ~E_DEPRECATED
අනාගතයේ දී වැරදි යා යුත්තේ ඒ දේ දකින්න. ඔබ නුහුරු නුපුරුදු දෝෂ රාශියක් දකිනු ඇත, නමුත් අනාගතයේදී ඔබට PHP යාවත්කාලීන කිරීමට අවශ්ය වූ විට එය ඔබට අප්රසන්න ගැටළු ඇතිවීම වළක්වනු ඇත.
දෝෂවල තේරුම කුමක්ද?
Undefined variable: my_variable_name
- මෙය සිදුවන්නේ භාවිතයට පෙර විචල්යයක් නිර්වචනය කර නොමැති විටය. PHP ස්ක්රිප්ට් ක්රියාත්මක කරන විට, එය අභ්යන්තරව ශුන්ය අගයක් ගනී. කෙසේ වෙතත්, විචල්යයක් නිර්වචනය කිරීමට පෙර එය පරීක්ෂා කිරීමට ඔබට අවශ්ය වන්නේ කුමන අවස්ථාවෙහිද? අවසානයේදී, මෙය "අලස කේතය" සඳහා වන තර්කයකි. සංවර්ධකයෙකු ලෙස, විචල්යයන් අර්ථ දැක්විය හැකි පරිදි ඒවායේ විෂය පථයන්හි ඉහළ ලෙස අර්ථ දක්වා ඇති විවෘත මූලාශ්ර ව්යාපෘතියක් දුටු විට මම එයට ප්රිය කරන බව ඔබට පැවසිය හැකිය. අනාගතයේ දී පැන නගින විචල්යයන් මොනවාදැයි පැවසීම පහසු කරවන අතර කේතය කියවීම / ඉගෙනීම පහසු කරයි.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- මෙය සිදුවන්නේ ඔබ අරාවෙහි අගයකට ප්රවේශ වීමට උත්සාහ කරන විට එය නොපවතී. මෙම දෝෂය වලක්වා ගැනීම සඳහා, කොන්දේසි සහිත පරීක්ෂණයක් කරන්න.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
තවත් විකල්පයක් නම් ඔබේ ශ්රිතයේ ඉහළින් හිස් අරාවක් ප්රකාශ කිරීමයි. මෙය සැමවිටම කළ නොහැකි ය.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(අමතර ඉඟිය)
- මට මෙම සහ වෙනත් ගැටළු වලට මුහුණ දෙන විට, මම නෙට්බීන්ස් IDE (නොමිලේ) භාවිතා කළ අතර එය මට අනතුරු ඇඟවීම් සහ දැන්වීම් රාශියක් ලබා දුන්නේය. ඒවායින් සමහරක් ඉතා ප්රයෝජනවත් ඉඟි ඉදිරිපත් කරයි. මෙය අවශ්යතාවයක් නොවන අතර විශාල ව්යාපෘති හැර මම තවදුරටත් IDE භාවිතා නොකරමි. මම
vim
මේ දිනවල වැඩි පුද්ගලයෙක් :).