PHP5.3-ról PHP5.4-re

A W3HOST wiki wikiből

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'];