Změny konfigurace
Hlášení
chyb
v
PHP
3
bylo
založeno
na
úrovních
,
představovaných
jednoduchou
číselnou
hodnotou
.
Hodnoty
se
sčítaly
pro
různé
úrovně
chyb
.
Obvyklé
hodnoty
byly
15
pro
hlášení
všech
chyb
a
varování
,
7
pro
hlášení
všeho
kromě
informativních
zpráv
,
ohlašujících
špatný
styl
a
podobné
věci
.
PHP
4
má
větší
množinu
úrovní
chyb
a
varování
a
přichází
s
konfiguračním
parserem
,
který
nyní
umožňuje
k
nastavení
potřebného
chování
používat
symbolické
konstanty
.
Úroveň
hlášení
chyb
by
měla
být
nyní
nastavována
explicitním
odebíráním
těch
úrovní
,
u
kterých
které
nechceme
,
aby
byly
hlášeny
(
pomocí
logické
operace
XOR
se
symbolickou
konstantou
)
.
E_ALL
.
Zní
to
komplikovaně
?
No
,
tak
řekněme
,
že
chcete
hlásit
všechny
chyby
s
výjimkou
jednoduchých
"
stylových
"
varování
,
která
jsou
zařazena
do
kategorie
popsané
symbolickou
konstantou
E_NOTICE
.
Potom
do
souboru
php.ini
vložíte
:
error_reporting
=
E_ALL
~
(
E_NOTICE
)
.
Pokud
chcete
potlačit
také
všechna
varování
,
přidáte
odpovídající
konstantu
do
závorek
s
použitím
binárního
operátoru
'
|'
:
error_reporting=
E_ALL
~
(
E_NOTICE
|
E_WARNING
)
.
Varování
|
Používání
starých
hodnot
7
a
15
pro
nastavení
hlášení
chyb
je
velmi
špatný
nápad
,
protože
to
potlačuje
některé
nově
přidané
třídy
chyb
včetně
syntaktických
.
To
může
vést
k
velmi
záhadnému
chování
,
kdy
skripty
nepracují
,
aniž
by
vydaly
jakoukoli
zprávu
o
chybě
.
Toto
v
minulosti
vedlo
k
množství
nereprodukovatelných
bug
reportů
(
hlášení
o
chybách
v
PHP
)
,
když
lidé
hlásili
problémy
s
enginem
,
které
nebyli
schopni
vystopovat
.
Pravou
příčinou
byla
obvykle
chybějící
uzavírací
závorka
'
}
'
v
souboru
připojeném
pomocí
"require
"
,
a
parser
je
nemohl
ohlásit
kvůli
špatně
nakonfigurovanému
hlášení
chyb
.
Takže
kontrola
nastavení
hlášení
chyb
by
měla
být
první
věcí
,
pokud
vaše
skripty
tiše
havarují
.
Zend
engine
může
být
nyní
považován
za
dost
vyspělý
na
to
,
aby
způsoboval
takové
podivné
chování
.
|
Přídavné varovné zprávy
Mnoho
existujících
kódů
v
PHP
3
používá
jazykové
konstrukty
,
které
by
měly
být
považovány
za
velmi
špatný
styl
psaní
,
neboť
přestože
nyní
dělají
zamýšlené
věci
,
snadno
mohou
být
narušeny
změnami
jinde
.
PHP
4
bude
vydávat
spousty
informativních
zpráv
v
takových
situacích
,
kdy
se
v
PHP
3
nic
nedělo
.
Snadnou
nápravou
je
vypnutí
zpráv
E_NOTICE
,
ale
obvykle
je
lepší
raději
opravit
kód
.
Nejčastějším
případem
,
který
bude
produkovat
takové
zprávy
,
je
použití
řetězců
bez
uvozovek
jako
prvků
pole
.
Jak
PHP
3
,
tak
PHP
4
je
budou
interpretovat
jako
řetězce
,
pokud
pod
tímto
jménem
není
známo
žádné
klíčové
slovo
ani
konstanta
.
Pokud
by
však
nějaká
taková
konstanta
(
někde
jinde
v
kódu
)
definována
byla
,
skript
může
havarovat
.
Může
to
přerůst
i
v
bezpečnostní
riziko
,
pokud
nějaký
útočník
předefinuje
řetězcové
konstanty
způsobem
,
který
mu
dá
přístupová
práva
,
jež
by
mít
neměl
.
Takže
PHP
4
vás
bude
nyní
varovat
,
pokud
použijete
řetězecovou
konstantu
neuzavřenou
do
uvozovek
,
jako
například
$HTTP_SERVER_VARS[
REQUEST_METHOD
]
.
Změníte-li
to
na
$HTTP_SERVER_VARS[
'REQUEST_METHOD'
]
,
parser
se
uklidní
a
výrazně
se
zlepší
styl
a
bezpečnost
vašeho
kódu
.
Další
věcí
v
PHP
4
je
hlášení
použití
neinicializovaných
proměnných
a
prvků
polí
.