PHP
downloads | documentation | faq | getting help | mailing lists | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

CLI a CGI> <Migrácia z PHP 4 na PHP 5
Last updated: Sun, 25 Nov 2007

view this page in

Spätne Nekompatibilné Zmeny

I keď vačšina existujúceho PHP 4 kódu by mala fungovať bez zmien, mali by ste dať pozor na následujúce spätne nekompatibilné zmeny:

  • strrpos() a strripos() teraz využívajú celý reťazec ako ihlu.
  • Nelegálne použitie offsetov reťazca spôsobuje E_ERROR namiesto E_WARNING.
  • array_merge() bola zmenená, aby prijímala iba polia. Ak sa pošle premenná, ktorá nie je pole, vyhodí sa E_WARNING pre každý taký parameter. Buďte opatrný, pretože váš kód môže začať emitovať E_WARNING z ničoho nič.
  • Premenná servera PATH_TRANSLATED už viac nie je nastavená implicitne pod Apache2 SAPI ako kontrast k situácii v PHP 4, kde je nastavená na rovnakú hodnotu ako premenná servera SCRIPT_FILENAME, kde nie je obývaná Apache-om. Táto zmena bola urobená, aby vyhovovala » CGI špecifikácii. Prosím, pozrite si » bug #23610 pre viac informácii.
  • Konštanta T_ML_CONSTANT už nie je definovaná rozšírením Tokenizer. Ak je error_reporting nastavený na E_ALL, PHP vygeneruje hlášku. I keď T_ML_CONSTANT sa nikdy vôbec nepožila, bola definovaná v PHP 4. V oboch PHP 4 a PHP 5 // a /* */ sa chápu ako konštanta T_COMMENT. Avšak PHPDoc štýlové komentáre /** */ , ktoré začínajú PHP 5 sú analyzované PHP, sa rozpoznávajú ako T_DOC_COMMENT.
  • $_SERVER by mala byť obývaná s argc a argv ak variables_order zahŕňa "S". Ak ste špecificky konfigurovali váš system, aby nevytváral $_SERVER, potom samozrejme by tam nemala byť. Zmenou bolo vždy urobiť argc a argv dostupné v CLI verzii bez ohľadu na nastavenie variables_order. CLI verzia bude teraz vždy obývať globálne premenné $argc a $argv.
  • Objekt so žiadnymi vlastnosťami sa už viac nepovažuje za "empty".
  • V niektorých prípadoch triedy musia byť deklarované pred použitím. Stane sa tak iba ak sa použije niektorá z nových vlastností PHP 5. Inak je správanie staré.
  • get_class() počínajúc PHP 5 vracia názov triedy ako bola deklarovaná, čo môže viesť k problémom v starších skriptoch, ktoré sa spoliehajú na predošlé správanie (názov triedy je lowercase). Možné riešenie je vyhľadať get_class() vo vašich skriptoch a použiť strtolower().
  • ip2long() teraz vracia FALSE, keď sa pošle neplatná IP adresa ako argument funkcii a už nie -1.

Example#1 strrpos() a strripos() teraz používa celý reťazec ako ihlu

<?php
var_dump
(strrpos('ABCDEF','DEF')); //int(3)

var_dump(strrpos('ABCDEF','DAF')); //bool(false)
?>

Example#2 Objekt so žiadnými vlastnosťami sa už viac nepovažuje za "empty"

<?php
class test { }
$t = new test();

var_dump(empty($t)); // echo bool(false)

if (!$t) {
    
// Sa vykona
}
?>

Example#3 V niektorých prípadoch sa triedy pred použitím musia deklarovať

<?php

//funguje bez chyb:
$a = new a();
class 
{
}


//vyhodi chybu:
$a = new b();

interface 
c{
}
class 
implements {


?>



CLI a CGI> <Migrácia z PHP 4 na PHP 5
Last updated: Sun, 25 Nov 2007
 
add a note add a note User Contributed Notes
Spätne Nekompatibilné Zmeny
paul at oconnor-web dot net
10-Apr-2008 04:17
The __call function will also lowercase the method arguement:

<?php
  
function __call($method, $args) {
     if (
$method == 'Foo') {
       return
true;
     } else {
       return
false
    
}
   }
?>

(= false)
Steven
19-Mar-2008 05:07
Three more that we discovered:

== 1. No longer can re-assign $this ==

The follwoing example works under PHP4 (it outputs "OK"), but produces a fatal error under PHP5:

<?php
 
class a
 
{
    var
$text;
    function
a() { $this->text = 'OK'; }
  }

  class
b
 
{
    var
$text = 'NOT OK';
    function
b() { $this = new a(); }
  }
   
 
$myClass = new b();
  echo
$myClass->text;
?>

== 2. No comments allowed after shorthand echo block ==

The follwoing example works under PHP4, but produces a sytax error under PHP5.

<?=//comment?>

== 3. Constructors return a reference as default ==

The follwoing example works under PHP4, but produces an E_NOTICE notice under PHP5.

<?php
 
class MyClass { function MyClass() { echo('OK'); } }
 
$myObj = null;
 
$myObj &= new MyClass();
?>

Removing the ampersand solves the problem
Aggelos Orfanakos
08-Nov-2007 05:10
As with array_merge(), array_merge_recursive() returns NULL in PHP 5 if a non-array parameter is passed to it.
Sinured
10-Aug-2007 04:43
Not mentioned above: The PHP/FI 2 function style (old_function aka cfunction) is no longer supported as of PHP 5.
nami
26-Jul-2007 07:22
addition of the note on 07-Sep-2004 06:40

if you write down your code like this PHP5 will just work fine:

<?php
     $array_1
= array('key1'=>'oranges','key2'=>'apples');
    
$array_2 = array('key3'=>'pears','key4'=>'tomatoes');
    
$array_3 = array();
    
$arr_gemerged = array_merge($array_1,$array_2,$array_3);
     echo
"result:<br>";
    
print_r($arr_gemerged);
     echo
"<br>";
?>

---

so you have to declare array_3 as array() instead of NULL
kemal djakman
22-Jun-2007 06:11
The handling of accessing empty property of a class error has also changed:
<?php

class Foo {

    var
$Bar = 'xxx';

    function
F() {
        echo
$this->$Bar;
    }
}

$Obj = new Foo();
$Obj->F();

?>

Notice the $ sign after object dereference opr?  $Bar is empty inside method F.   PHP4 would only generate a warning, PHP5 throws a fatal error
Amir Laher
29-Apr-2007 02:34
Some other things to be aware of:

some extra strictness:
* object members can no longer be accessed using array-member syntax
* function-calls with too many arguments will now cause errors.

Also, from PHP5.2, custom session handlers are affected:
* Best not to use global objects in custom session-handling functions. These would get destructed *before* the session is written (unless session_write_close() is called explicitly).
28-Feb-2006 02:03
is_a have been deprecated. You can simply replace all occurences with the new instanceOf operator, although this will break backwards-compatibility with php4.
dward . maidencreek.com
02-Nov-2004 12:54
Another change that we've had problems with while trying to use PHP4 code in PHP5 is how $this is carried across static method calls if they are not declared static in PHP5.  The main issue was that debug_backtrace() now shows the first class with -> instead of the second with :: in the backtrace element when the method in the second class was called statically (using ::) from a method in the first class.
07-Sep-2004 09:40
Be careful with array_merge in PHP5.1 not only a E_WARNING is thrown, but also the result is an empty array. So if you merge two select queries and the last one is empty you will end up with no array at all.

<?php
        $array_1
= array('key1'=>'oranges','key2'=>'apples');
       
$array_2 = array('key3'=>'pears','key4'=>'tomatoes');
       
$array_3 = null;
       
$arr_gemerged = array_merge($array_1,$array_2,$array_3);
       
print_r($arr_gemerged);
        echo
"<br>";
?>

Result on php4:
Array ( [key1] => oranges [key2] => apples [key3] => pears [key4] => tomatoes )

Result on php5:
Warning: array_merge() [function.array-merge]: Argument #3 is not an array in /removed/by/danbrown/for/manual.php on line 7
john.g
26-Aug-2004 10:45
PATH_TRANSLATED is handy when using Apache's ModRewrite engine, as it gives you the name and path of the resulting file rather than the one that was requested by the user. Since PHP 5.0 and Apache 2 no longer support this variable, I created a workaround by adding an environment variable to my ModRewrite command:

Original:
RewriteRule ^/test/(.*)\.php(.*) /test/prefix_$1.php$2

Adjusted:
RewriteRule ^/test/(.*)\.php(.*) /test/prefix_$1.php$2 [E=TARGET:prefix_$1.php]

I could then find out the resulting file name through the super global $_ENV, for instance:

<?php
echo "The actual filename is ".$_ENV['REDIRECT_TARGET'];
?>

Note: The "REDIRECT_" prefix appears to be allocated automatically by ModRewrite.
cyberhorse
05-Aug-2004 10:07
clone() is a php function now.

if you create a subclass, it no longer uses samename methods in superclass as a constructor.

CLI a CGI> <Migrácia z PHP 4 na PHP 5
Last updated: Sun, 25 Nov 2007
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites