08. januar 2006 - 19:24Der er
19 kommentarer og 1 løsning
Migrering til PHP5
Er der nogen der har nogen erfaring med migrering fra PHP4 til PHP5?
Helt specifikt har jeg et problem med OOP, hvor der jo er sket meget siden PHP4. Da man i PHP5 nu skal benytte enten public/private/protected til at definere sine klassevariable har jeg et problem med den gamle syntaks fra PHP4, hvor man erklærer dem med var. Findes der en måde at omgå dette problem med?
Det skal egentlig bare være en midlertidig løsning, da alle klasser skal konverteres til PHP5. Kan man få PHP5 til at lave dem til public som standard?
Hvad præcis har du problemer med? Jeg har en del gamle PHP4-klasser som kører helt uden problemer i PHP5. Disse bruger også var osv, og ingen private etc... I langt de fleste tilfælde burde alt som kørte i PHP4 køre i PHP5.
Du kan stadig benytte PHP4 syntax til dine klasser. Hvis ikke du har angivet andet, vil metoder og variable være public. Det samme gælder for constructoren. Hvis PHP5's __construct() ikke findes benytter den PHP4 constructoren med klassens navn.
Kom lige i tanker om en (mere eller mindre) væsentlig ændring mellem OO i PHP4 og PHP5. I PHP5 bliver objekter altid 'passed by reference', hvor de normalt blev kopieret i PHP4. Det svarer til at bruge &-operatoren.
Problemet er at PHP spytter tusindvis af fejlbeskeder ud, hvor den brokker sig over at jeg bruger "var" i stedet for PPP i erklæringen af klasse variable. Jeg fandt ud af at jeg skulle ændre i error reporting og ekskludere E_STRICT fejlbeskeder, men syntes ikke at dette rykkede ved noget. Fandt senere ud af at PHP ignorerer min php.ini fil. Nu er det store spørgsmål, hvorfor gør den det og hvordan får jeg den til at læse den? Tager jeg en phpinfo(); så kan jeg se at PHP har den rigtige path til filen ("/etc/php.ini"), men den læser ikke mine konfigurationsdirektiver.
Problemet med passed by reference kan løses ved at aktivere zend.ze1_compatibility_mode i php.ini, så det er ikke noget problem, hvis blot min php.ini fil bliver læst.
Nogen idéer?
Ps. php.ini har følgende rettigheder: -rwxr--r-- og er ejet af root. Jeg kører et fedora system uden SELinux. Apache2 og PHP5 er kompileret fra bunden med følgende compile options: './configure' '--with-apxs2=/usr/local/apache2/bin/apxs' '--prefix=/usr' '--with-regex=php' '--with-config-file-path=/etc' '--enable-memory-limit' '--with-pear=/usr/share/php' '--enable-ftp' '--enable-sockets' '--with-mime-magic=/usr/share/file/magic.mime' '--with-mysql=/usr/lib/mysql' '--enable-track-vars' '--enable-safe-mode' '--enable-magic-quotes' '--disable-short-tags' '--enable-trans-sid' '--with-zlib' '--with-bz2' '--enable-ftp' '--with-dom=shared' '--with-xmlrpc' '--enable-yp' '--with-gd' '--enable-gd-native-ttf' '--with-png' '--with-jpeg-dir=/usr/lib' '--enable-mbstring=da' '--enable-mbstr-enc-trans' '--enable-mbregex' '--enable-calendar' '--with-dbase' '--with-gd' '--with-freetype' '--enable-gd-native-ttf' '--with-jpeg-dir=/usr/local' '--with-zlib-dir=/usr/local' '--with-openssl=/usr' '--with-pdo-mysql=/usr/local' '--with-curl' '--with-mm=/usr/local/lib'
Har du husket at restarte Apache efter du har ændret php.ini?
Når du kører PHP som apache module, så er du nødt til at restarte Apache hver gang du ændrer i php.ini. Det er det eneste jeg lige kan komme i tanker om.
Jeg kører selv med PHP5 på en Apache2 under Debian Sarge, og jeg har aldrig været ude for at den ikke ville sluge mine rettelser efter en restart.
Jeg er virkelig blank her, så det må næsten betyde at det er noget tåbeligt simpelt :o) Nu har du husket at fjerne ; foran de linie du har ændret, ikk'?
Det skule jeg da ikke mene. Det kan man da kun i FreeBSD kan man ikke?
Den er kompileret med følgende og det er en Apache 2.2: ./configure \ '--enable-so' \ '--enable-rewrite=shared' \ '--sysconfdir=/etc/httpd' \ '--enable-expires' \ '--enable-headers' \ '--enable-mime-magic' \ '--with-mpm=prefork'
Nej, du kan også lave jails i Linux. Men hvis du ikke selv har sat et jail op, så er jeg ret sikker på at der ikke er et :o)
Min eneste bemærkning til din configure er at det ikke er nødvendigt at indkapsle argumenterne i '.
Jeg må indrømme at det her er FOR underligt, så du kan da godt prøve med Apache 1.3 i stedet. Ellers kan du måske prøve at køre PHP som CGI og se om den virker bedre.
Ja, det er rettet. Det er fordi at jeg har jongleret lidt frem og tilbage med PHP4 og PHP5, så jeg havde behov for to forskellige php.ini'er.
Det her virkede for et par dage siden og jeg fatter simpelthen ikke hvad der er gået galt, siden at den opfører sig så mærkeligt. Jeg mistænker lidt Apache for at være problemet.
Med hensyn til de "var is deprecated" beskeder du får, så er det fordi error-reporting indeholder E_STRICT
E_STRICT får PHP til at komme med kommentare om mulige deprecations, forbedringer og andet... i PHP 5.0.x udsender "var" en notice m. deprecation, men i PHP 5.1 er dette iirc ændret til at var bare er et alias for public, så ingen notice længere..
--
Udover det, så er stort set ingen funktioner ændret mellem 4 og 5, så ja - en af de største forskelle er faktisk pass-by-reference af objekter...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.