PHP5.3-ról PHP5.4-re
Tartalomjegyzék
PHP5.3-ról PHP5.4-re
Inkompatibilis változások PHP5.4-ben
Backward Incompatible Changes in PHP5.4
Ideiglenes megoldások aktiválása
Amennyiben a PHP változásokból eredő ideiglenes megoldásainkat a workaround.php fájlban helyezzük el, több lehetőség is adott a fájlunk meghívására (többnyire minden egyes oldaltöltéskor ennek az ideiglenes kódnak le kell futnia):
- Ha ismerünk olyan fájlt (legtöbbször konfigurációs állomány), ami minden PHP fájl futtatásakor meghívódik, egyszerűen include-olhatjuk a helyettesítő kódunkat:
<?php ... include_once("/a/fajlunk/eleresi/utvonala/workaround.php"); ... ?>
- Megoldás lehet, ha a weboldal gyökerében levő .htaccess fájlban helyezzük el a hivatkozást a workaround.php fájlunkra, ami automatikusan mindig meghívódik majd:
...
php_value auto_prepend_file "/a/fajlunk/eleresi/utvonala/workaround.php"
...
Javasolt megoldások
A workaround.php-ba helyezendő kódrészletek (forrás: php.net, Ügyfeleink, W3HOST, stackoverflow.com, stackoverflow.com):
register_globals
PHP5.4-ben a register_globals direktíva megszűnt, helyettesítés:
### register_globals replacement extract($_ENV,EXTR_SKIP); extract($_GET,EXTR_SKIP); extract($_POST,EXTR_SKIP); extract($_COOKIE,EXTR_SKIP); extract($_SERVER,EXTR_SKIP); extract($_FILES,EXTR_SKIP);
register_long_arrays
PHP5.4-ben a register_long_arrays direktíva megszűnt, helyettesítés:
### register_long_arrays replacement $HTTP_ENV_VARS = &$_ENV; $HTTP_GET_VARS = &$_GET; $HTTP_POST_VARS = &$_POST; $HTTP_POST_FILES = &$_FILES; $HTTP_COOKIE_VARS = &$_COOKIE; $HTTP_SERVER_VARS = &$_SERVER; $HTTP_SESSION_VARS = &$_SESSION;
session függvények
PHP5.4-ben a session_is_registered(), session_register() és session_unregister() függvények megszűntek:
### Fix for removed Session Functions function fix_session_register() { function session_register() { $args = func_get_args(); foreach ($args as $key) { $_SESSION[$key]=$GLOBALS[$key]; } } function session_is_registered($key) { return isset($_SESSION[$key]); } function session_unregister($key) { unset($_SESSION[$key]); } } if (!function_exists('session_register')) fix_session_register();
htmlspecialchars() függvény alap kódolása UTF-8 lett
PHP5.4.0 előtt a htmlspecialchars() függvény encoding paraméterének elhagyásával az alap kódolás ISO-8859-1 lett. PHP5.4.x -ben és php5.5.x -ben ez UTF-8 -ra változott. Így ha a htmlspecialchars() függvény nem UTF-8 kódolású szöveget kap, akkor üres string-el tér vissza.
###Fix for htmlspecialchars encoding function myhtmlspecialchars($string, $flags = null, $encoding = "ISO-8859-1", $double_encode = true) { if ($flags === null) { $flags = ENT_COMPAT | ENT_HTML401; } return htmlspecialchars($string, $flags, $encoding, $double_encode); }
Majd a php fájlokban cserélni kell a htmlspecialchars() függvényeket myhtmlspecialchars() -ra.
Linux alatt a következő parancs segíthet a htmlspecialchars() függvény cserére:
for filename in $(find ./ -type f -name '*.php' -exec grep -l 'htmlspecialchars(' '{}' \;) ; \ do sed -i 's/htmlspecialchars(/myhtmlspecialchars(/g' $filename; done
A függvények argumentumában elhelyezhető referencia hivatkozás megszűnt (call_user_func_array(), Drupal)
Hibaüzenet:
PHP Fatal error: Call-time pass-by-reference has been removed in .../includes/module.inc on line 406
Kód:
$result = call_user_func_array($function, &$args);
Az argumentumokat már nem lehet átadni referenciaként a call_user_func_array() függvénynek.
A workaround.php-ba a következő függvényt helyezzük el forrás: stackoverflow.com:
function &array_make_references(&$arrSomething) { $arrAllValuesReferencesToOriginalValues=array(); foreach($arrSomething as $mxKey=>&$mxValue) $arrAllValuesReferencesToOriginalValues[$mxKey]=&$mxValue; return $arrAllValuesReferencesToOriginalValues; }
Majd a módosított kód:
$result = call_user_func_array($function, array_make_references($args));
Fájl feltöltés
HTML form:
<INPUT TYPE="file" NAME="img1" SIZE="30">
majd a php kódban a következő hivatkozás működött PHP5.4 előtt:
$img1_name: File neve $img1_size: File mérete $img1_type: File típusa copy("$img1", "$UploadedPath/$pic_name")
PHP5.4 után a változókra a következő megfeleltetés igaz:
$img1_name=$_FILES['img1']['name']; $img1_size=$_FILES['img1']['size']; $img1_type=$_FILES['img1']['type']; $img1=$_FILES['img1']['tmp_name'];