Tutorials
PHP 4 -> PHP 5
Wat is het verschil met PHP 4?
Pagina 1
Inleiding
Basis
Wat is er even snel gezegd verandert in PHP 5 in vergelijking met PHP 4? PHP 5 maak nu gebruik van de Zend Engine versie 2, die voor betere prestaties zou moeten zorgen. Als het goed is zou je 'oude' PHP 4 code probleemloos op PHP 5 te draaien moeten zijn, maar er zijn nog steeds een paar veranderingen die de werking van je script kunnen beinvloeden en dus misschien tot een failure van je script kunnen leiden. Die veranderingen en de nieuwe dingen behandel ik in deze tutorial.
Wat is er even snel gezegd verandert in PHP 5 in vergelijking met PHP 4? PHP 5 maak nu gebruik van de Zend Engine versie 2, die voor betere prestaties zou moeten zorgen. Als het goed is zou je 'oude' PHP 4 code probleemloos op PHP 5 te draaien moeten zijn, maar er zijn nog steeds een paar veranderingen die de werking van je script kunnen beinvloeden en dus misschien tot een failure van je script kunnen leiden. Die veranderingen en de nieuwe dingen behandel ik in deze tutorial.
Pagina 2
Backward Incompatible veranderingen
Het zou dus moeten kunnen werken, maar let toch op!
Nieuwe keywords
Deze keywords mag je dus niet meer gebruiken als constante of whatever ;)
Dit zijn ze:
- exception
- catch
- try
- private
- public
- protected
- interface
- protected
- throw
- implements
- abstract
- clone
- final
- php_user_filter
Functies
Ook met bepaalde functies zijn er veranderingen.
- strrpos() en strripos() gebruiken nu een hele string als een needle:
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
- array_merge() accepteert nu alleen array's. voed je array_merge() toch met iets anders, dan krijg je een E_WARNING error.
- get_class(), get_parent_class() en get_class_methods() geven nu de namen van de classes terug zoals ze gedeclareert zijn(hoofdlettergevoelig) en dat kan problemen geven in oudere scripts, want daar werd de naam altijd in kleine letters terug gegeven. Heb je hier problemen mee, gebruik dan strtolower().
- ip2long() geeft nu FALSE in plaats van -1 terug als er een ongeldig IP-adres wordt doorgegeven
Andere uitzondering in PHP 5
-Ongeldig gebruik van string offsets veroorzaakt nu een E_ERROR ipv een E_WARNING, voorbeeld: <? $str = 'abc'; unset($str[0]); ?>
- de T_ML_COMMENT constante is nu niet meer gebruikt door de tokenizer extensie. dit wordt nu herkent als T_DOC_COMMENT
- een object zonder eigenschappen wordt nu meer als leeg gezien: <?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// wordt uitgevoerd
}
?>
- Soms moeten classes eerst worden gedeclareert voordat ze worden gebruikt. Dat is zo als sommige nieuwe dingen van PHP 5 worden gebruikt, gebeurt dat niet, blijft het gedrag van de classe hetzelfde: <?php //geen errors:
$a = new a();
class a { }
//error:
$a = new b();
interface c{ }
class b implements c { }
?>
Nieuwe keywords
Deze keywords mag je dus niet meer gebruiken als constante of whatever ;)
Dit zijn ze:
- exception
- catch
- try
- private
- public
- protected
- interface
- protected
- throw
- implements
- abstract
- clone
- final
- php_user_filter
Functies
Ook met bepaalde functies zijn er veranderingen.
- strrpos() en strripos() gebruiken nu een hele string als een needle:
<?php
var_dump(strrpos('ABCDEF','DEF')); //int(3)
var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>
- array_merge() accepteert nu alleen array's. voed je array_merge() toch met iets anders, dan krijg je een E_WARNING error.
- get_class(), get_parent_class() en get_class_methods() geven nu de namen van de classes terug zoals ze gedeclareert zijn(hoofdlettergevoelig) en dat kan problemen geven in oudere scripts, want daar werd de naam altijd in kleine letters terug gegeven. Heb je hier problemen mee, gebruik dan strtolower().
- ip2long() geeft nu FALSE in plaats van -1 terug als er een ongeldig IP-adres wordt doorgegeven
Andere uitzondering in PHP 5
-Ongeldig gebruik van string offsets veroorzaakt nu een E_ERROR ipv een E_WARNING, voorbeeld: <? $str = 'abc'; unset($str[0]); ?>
- de T_ML_COMMENT constante is nu niet meer gebruikt door de tokenizer extensie. dit wordt nu herkent als T_DOC_COMMENT
- een object zonder eigenschappen wordt nu meer als leeg gezien: <?php
class test { }
$t = new test();
var_dump(empty($t)); // echo bool(false)
if ($t) {
// wordt uitgevoerd
}
?>
- Soms moeten classes eerst worden gedeclareert voordat ze worden gebruikt. Dat is zo als sommige nieuwe dingen van PHP 5 worden gebruikt, gebeurt dat niet, blijft het gedrag van de classe hetzelfde: <?php //geen errors:
$a = new a();
class a { }
//error:
$a = new b();
interface c{ }
class b implements c { }
?>
Pagina 3
CLI en CGI
In PHP 5 zijn er wat veranderingen in de CLI en CGI bestandsnamen. In PHP 5 is de CGI versie hernoemd naar php-cgi.exe (eerst gewoon php.exe) en de CLI versie bevindt zich nu in de basis directory (in PHP < 5 in main/php.exe).
In PHP 5 is het ook geintroduceerd als een nieuwe mode: php-win.exe. Hetzelfde als CLI, behalve dat hij niets output. Er komt dus geen dos-boxje. Dit gedrag is hetzelfde als dat van php-gtk.exe.
In PHP 5 worden de argc en arcv altijd gevult, maakt niet uit wat er in php.ini staat. Zelfs register_argc_argv uit staan maakt niet uit.
Zie ook: Commandline Reference
In PHP 5 is het ook geintroduceerd als een nieuwe mode: php-win.exe. Hetzelfde als CLI, behalve dat hij niets output. Er komt dus geen dos-boxje. Dit gedrag is hetzelfde als dat van php-gtk.exe.
In PHP 5 worden de argc en arcv altijd gevult, maakt niet uit wat er in php.ini staat. Zelfs register_argc_argv uit staan maakt niet uit.
Zie ook: Commandline Reference
Pagina 4
Apache configuratie bestanden
Omdat de ISAPI module van naam zijn verandert, moet er ook wat verandering in de bestanden van Apache gemaakt worden. Het is echter extreem simpel, zie het voorbeeld:
Als je server in CGI mode staat, moet je dat natuurlijk ook veranderen:
# verander dit:
LoadModule php4_module /php/sapi/php4apache2.dll
# in dit:
LoadModule php5_module /php/php5apache2.dllAls je server in CGI mode staat, moet je dat natuurlijk ook veranderen:
# verander dit:
Action application/x-httpd-php "/php/php.exe"
# in dit:
Action application/x-httpd-php "/php/php-cgi.exe"
Reacties
0