php verzije

Testiranje kompatibilnosti PHP verzija

Pošto sve verzije PHP-a s vremena na vreme dolaze do svog zvaničnog kraja života (EOL – End Of Life), važno je da svi plugini koji su u fazi razvoja ili već kreirani budu kompatibilni sa novom verzijom PHP-a.

Zato ćemo vas u ovom tekstu provesti kroz proces testiranja plugina za potrebe utvrđivanja kompatibilnosti sa trenutnom verzijom PHP-a.

Zašto testirati kompatibilnost sa verzijama PHP-a?

Kao što znate, WordPress je napisan u PHP-u i kao takav, mora biti sposoban da se pokrene barem na minimalno podržanoj verziji PHP-a koja je dostupna na web hosting paketu koji koristite. I dok WordPress preporučuje određenu minimalnu verziju PHP-a, starije verzije PHP-a će na kraju dostići kraj životnog ciklusa i neće dobijati nikakve sigurnosne nadogradnje u skorijoj budućnosti.

Na primer, trenutna preporučena minimalna verzija PHP-a za pokretanje WordPress-a je 7.4, koja je dostigla status kraja životnog ciklusa 28. novembra 2022. godine.

Kao developer važno je da imate ustanovljen proces za testiranje vaših plugina na kompatibilnost sa verzijama PHP-a.

Gde pronaći informacije o promenama u verzijama PHP-a

Da biste znali kada i kako će se verzije PHP-a menjati, dobro je referisati se na zvanični PHP sajt.

Na stranici „Supported Versions“, možete pronaći informacije o tome koje verzije trenutno podržavaju, na kojem su nivou podrške, a koje verzije su dostigle kraj životnog ciklusa.

U sekciji PHP dokumentacije možete pronaći vodiče o migraciji sa starijih verzija PHP-a, koji prikazuju najvažnije promene između stare i nove verzije. Na primer, vodič „Migrating from PHP 7.4.x to PHP 8.0.x“ prikazuje najvažnije promene između PHP 7.4 i PHP 8.0.

Evo primera jednog plugina:

<?php /** 
* Plugin Name: WP Learn Compatibility 
* Description: Learn to test a plugin for PHP Version Compatibility 
* Version: 1.0.1 * 
* @package wp-learn-compatibility 
*/ 

/** 
* Posts fetcher class 
*/ 
class Post_Fetcher { 

/** 
* Array posts 
* 
* @var array 
*/ 
protected $posts; 

/** 
* Fetch the WordPress posts 
*/ 
public function post_fetcher() { 
  $this->posts = get_posts();
 } 

/** 
* Fetch the posts and return the formatted HTML 
* 
* @return string 
*/ 
public function fetch_posts() { 
  $post_html = '<div class="post">';
  foreach ( $this->posts as $post ) { 
     if ( property_exists( $post, 'post_title' ) ) { 
       $post_html .= sprintf(
         '<h4><a href="%s">%s</a></h4>', 
         get_permalink( $post->ID ), 
         $post->post_title
    ); 
  } 
 } 
$post_html .= '</div>';
return $post_html;
  } 
} 

add_shortcode( 'wp_learn_php_compatibility',
'wp_learn_php_compatibility_shortcode_render' );
 
/** 
* Shortcode callback function for wp_learn_php_compatibility shortcode 
* 
* @return string 
*/ 
function wp_learn_php_compatibility_shortcode_render() { 
$post_fetcher = new post_fetcher(); 
$post_html = $post_fetcher->fetch_posts(); 
return $post_html; 
}

Plugin iz gornjeg primera registruje shortcode koji dohvata listu postova i prikazuje naslov svakog posta svaki put kada se koristi shortcode. Klasa post_fetcher upravlja dohvatanjem postova.

Testiranjem ovog shortcode-a na stranici, možete videti da radi kako se očekuje kada se koristi PHP 7.4.

Kako testirati kompatibilnost sa verzijama PHP-a

Postoji nekoliko načina za testiranje kompatibilnosti sa verzijama PHP-a, koji zahtevaju različite kombinacije novijih verzija PHP-a i instalaciju različitih alatki. U ovom tutorijalu, pogledaćemo dva moguća metoda, svaki sa svojim prednostima i manama.

Ručno testiranje kompatibilnosti

Ručni metod podrazumeva postavljanje WordPress okruženja sa PHP verzijom koju želite da testirate, a zatim i testiranje WordPress plugina u tom okruženju.

Postavljanje ovog okruženja može se obaviti na nekoliko načina, a najčešća opcija bila bi korišćenje lokalnog razvojnog okruženja koje dozvoljava promenu verzije PHP, poput Mamp-a, Xampp-a, Laragon-a ili LocalWP-a.

Za potrebe ovog teksta testiranje ćemo obaviti na verziji PHP 8.1.

Jednostavan način da proverite da li ste na pravoj verziji PHP-a je da napravite info.php datoteku u root-u svoje WordPress instalacije i unesete sledeći kod:

<?php
phpinfo();

Nakon toga otvorite info.php fajl u vašem browseru. Sada bi trebalo da vidite prikazane informacije o verziji PHP-a.

Imajte u vidu da kada postavite testno okruženje, treba obavezno da omogućite opciju WordPress debagovanja.

Da biste to uradili, izmenite wp-config.php datoteku i ažurirajte liniju koja definiše konstantu WP_DEBUG, tako što ćete je postaviti na vrednost true:

define( 'WP_DEBUG', true );

Sada dodajte konstantu WP_DEBUG_DISPLAY i postavite je na false, a zatim dodajte konstantu WP_DEBUG_LOG i postavite je na true. Na taj način će se sve greške beležiti u debug.log fajl u wp-content folderu.

define( 'WP_DEBUG_DISPLAY', false );
define( 'WP_DEBUG_LOG', true );

Takođe možete postaviti konstantu WP_DEBUG_LOG na lokaciju koju želite, navodeći pritom putanju do fajla. Na primer:

define( 'WP_DEBUG_LOG', '/home/ubuntu/wp-local-env/sites/nekisajt/logs/debug.' . date( 'Y-m-d' ) . '.log' );

Sada možete da testirate svoj plugin, tako što ćete osvežiti stranicu. Prvo što ćete primetiti jeste da funkcionalnost shortcode-a više ne funkcioniše.

Ako pogledate debug.log, videćete sledeće upozorenje:

PHP Warning: foreach() argument must be of type array|object, null given in /home/ubuntu/wp-local-env/sites/nekisajt/wp-content/plugins/wp-learn-php-compatibility/wp-learn-php-compatibility.php on line 36

Ako sada odete na liniju 36, videćete da kod pokušava da radi iteraciju kroz svojstvo $this->posts, koje je iz nekog razloga null. Razlog možda nije odmah očigledan, pa ćete možda morati da konsultujete vodič pod nazivom  „Migrating from PHP 7.4.x to PHP 8.0.x“.

U sekciji „Backward Incompatible Changes“, videćete sledeću promenu:

Methods with the same name as the class are no longer interpreted as constructors. The __construct() method should be used instead.

Dakle, u ovom slučaju je očigledno da konstruktor metoda klase mora biti ažurirana.

Kada to ispravite, osvežite stranicu i videćete da plugin ponovo radi.

Činjenica je da Iako ručno testiranje funkcioniše, na kraju krajeva to je dosadan proces. Srećom, većinu testova možete jednostavno automatizovati korišćenjem alata zvanog PHPUnit. To će vam omogućiti da uvek isporučite svoj kod bez grešaka i problema sa PHP kompatibilnošću. Ipak, ovaj alat nije predmet našeg teksta pa nećemo detaljnije pisati na tu temu.

Skeniranje vašeg koda pomoću PHPCompatibilityWP

Postoje alati koje možete koristiti za testiranje PHP kompatibilnosti, a po nama jedan od najkorisnijih je alat pod nazivom PHPCompatibility, koji dolazi sa skupom pravila za alat PHP_CodeSniffer.

PHP_CodeSniffer je alat sa komandnom linijom koji se može koristiti za skeniranje vašeg koda radi pronalaženja grešaka i upozorenja.

PHPCompatibility alat je skup pravila koje se mogu koristiti zajedno sa PHP_CodeSniffer-om za skeniranje vašeg koda na kompatibilnost sa određenom PHP verzijom.

Za WordPress programere postoji specifičan set pravila pod nazivom PHPCompatibilityWP, koji je zapravo PHPCompatibility set pravila za WordPress projekte.

Ono što je dobro kod PHPCompatibility/PHPCompatibilityWP je to da ne morate konfigurisati drugu verziju PHP-a da biste ga koristili. Možete da ga koristite sa vašom postojećom verzijom PHP-a i ujedno proverite vaš kod prema pravilima za određenu verziju PHP-a.

Da biste instalirali i koristili PHPCompatibilityWP, potrebno je instalirati Composer. Kako biste omogućili rad Composer-a, potrebno je da na računaru imate  instaliran PHP, tako da možete koristiti PHP CLI binarnu datoteku, koja vam omogućava izvršavanje PHP skripti u terminalu, a ne samo u browseru.

Instaliranje Composera izlazi iz okvira ovog teksta, ali ukoliko želite da možete da pronađete uputstva na zvaničnom sajtu Composera za macOS/Linux iii Windows operativne sisteme.

Na PHP sajtu pod sekcijom „Installation and Configuration“ možete pronaći uputstvo kako da instalirate PHP na vašem sistemu.

Kada instalirate PHP, pobrinite se da dodate putanju do PHP CLI binarne datoteke u sistemsku putanju vašeg računara, kako biste mogli da pokrećete PHP naredbe sa bilo kog mesta na vašem računaru.

Izvršavanjem sledeće naredbe u terminalu možete da proverite da li je PHP uopšte instaliran :

php -v

Slično tome, možete da proverite da li imate Composer instaliran. tako što ćete da izvršite sledeću naredbu u terminalu:

composer -V

Kada instalirate Composer, možete da inicijalizujete Composer projekat pokretanjem sledeće naredbe unutar foldera plugina. Ako već koristite Composer za svoj plugin, možete preskočiti ovaj korak.

composer init

Ovo će da inicijalizuje novi Composer projekat u vašem folderu plugina. Možete da prihvatite podrazumevane vrednosti za većinu pitanja, ali kada vas pita da interaktivno definišete zavisnosti (require) i interaktivno definišete razvojne zavisnosti (require-dev), trebalo bi da odgovorite ne.

Takođe, možete preskočiti PSR-4 autoload mapiranje.

Kada završite, imaćete datoteku composer.json, koja je datoteka koju Composer koristi za upravljanje zavisnostima vašeg projekta.

Zatim je potrebno da instalirate Composer plugin za upravljanje postavkom installed_paths za PHP_CodeSniffer pokretanjem sledeće naredbe. Ako već imate ovaj plugin instaliran, možete ga zanemariti.

composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true

Zatim možete instalirati Composer installer plugin i PHPCompatibilityWP alat pokretanjem sledećih naredbi:

composer require --dev dealerdirect/phpcodesniffer-composer-installer:"^1.0"
composer require --dev phpcompatibility/phpcompatibility-wp:"*"

Ovo će postaviti i instalirati potrebne zavisnosti u vašem composer.json fajlu .

Napomena o verzijama PHPCompatibility i PHPCompatibilityWP

Trenutno, stabilno izdanje PHPCompatibility je 9.3.5, a najnoviji „sniffs“ su deo nadolazećeg izdanja verzije 10.0.0. Trenutna stabilna verzija PHPCompatibilityWP je 2.1.4.

Kada verzija 10.0 PHPCompatibility bude objavljena, verzija 3.0 PHPCompatibilityWP će biti objavljena, koja će zavisiti od verzije 10.0 PHPCompatibility.

U međuvremenu, moguće je instalirati dev-develop granu PHPCompatibility kako biste pokrenuli PHPCS sa najnovijim pluginima PHP 8 pre nego što budu objavljeni u verziji 10.0.0 PHPCompatibility, kako je detaljno opisano u WordPress VIP dokumentaciji.

Da biste to uradili, pokrenite sledeće naredbe kako biste postavili alias za dev-develop granu PHPCompatibility:

composer config minimum-stability dev
composer require --dev phpcompatibility/phpcompatibility-wp:"^2.1"
composer require --dev phpcompatibility/php-compatibility:"dev-develop as 9.99.99"

Ove naredbe će postaviti alias za develop granu PHPCompatibility kao 9.x verziju koja je unutar dozvoljenog opsega za PHPCompatibility, i postaviće PHPCompatibilityWP da instalira najnoviju stabilnu verziju 2.1.

Kada PHPCompatibility 10 i PHPCompatibilityWP 3 budu objavljeni biće moguće ažurirati ograničenje verzije PHPCompatibilityWP na „^3.0“, što će zavisiti od verzije 10 PHPCompatibility.

Sa svim ovim instaliranim, možete pokrenuti PHPCompatibilityWP alat u vašem fajlu plugina.

Preporučeni način da to uradite je da pokrenete PHPCompatibilityWP prema određenoj osnovnoj verziji PHP-a. U ovom primeru, možete ga pokrenuti prema verziji 7.4 PHP-a postavljajući testVersion promenljivu u vreme izvršavanja na 7.4.

./vendor/bin/phpcs --runtime-set testVersion 7.4- -p wp-learn-php-compatibility.php --standard=PHPCompatibilityWP

I videćete ovaj izlaz:

W 1 / 1 (100%) 

FILE: /Users/nvmihajlovic/wp-local-env/sites/nekisajt/wp-content/plugins/wp-learn-php-compatibility/wp-learn-php-compatibility.php 
----------------------------------------------------------------------------------------------------------------------------------------- 
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE 
----------------------------------------------------------------------------------------------------------------------------------------- 
15 | WARNING | Use of deprecated PHP4 style class constructor is not supported since PHP 7. 
----------------------------------------------------------------------------------------------------------------------------------------- 
Time: 33ms; Memory: 8MB

Obratite pažnju da se ista greška prijavljuje kao i ručni metod, ali ovog puta je mnogo preciznija. Kaže nam tačno na kojoj liniji se greška nalazi i šta je greška.

Sada možemo ispraviti grešku u konstruktoru klase.

Zaključak

Prilikom korišćenja alata kao što je PHPCompatibilityWP možete naići na situaciju da alat ne može da uhvati svaku pojedinačnu grešku u kompatibilnosti.

Na primer, jedna od promena od PHP 7.4 do PHP 8.0 je uklanjanje mogućnosti korišćenja array_key_exists() sa objektima. Umesto toga preporuka je da koristite property_exists(). PHPCompatibilityWP alat ne zna da li je promenljiva koju prosleđujete (array_key_exists()) u stvari niz ili objekat, pa ne može da vas upozori na ovu situaciju.

Ovde dolazi do izražaja automatizovanje vaših ručnih testova. Kada pokrenete testove u novom PHP okruženju, oni možda neće uspeti da se izvrše. Ako niste omogućili logovanje grešaka, nećete moći da vidite šta je konkretno problem. Ukoliko je logovanje grešaka omogućeno, sve greške će biti prikazane u log fajlu.

Kombinovanje alata poput PHPCompatibility sa automatizovanim testiranjem i ručnim testiranjem o kojem smo u ovom tekstu pisali, omogućiće vam da proverite da li je vaš plugin kompatibilan sa trenutnim i budućim verzijama PHP.

Bez komentara

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *