Fil-qosor: In-namespaces f'PHP huma xi ħaġa bħal folders għall-ismijiet tal-klassijiet: App\Rechnung\Pdf u Bibliothek\Pdf jistgħu jeżistu flimkien mingħajr ma jiddisturbaw lil xulxin. L-autoloading jiżgura li PHP jgħabbi klassi biss meta tkun meħtieġa għall-ewwel darba. L-istandard PSR-4 jistabbilixxi kif minn isem ta' klassi ssir mogħdija ta' fajl; Composer imbagħad jiġġenera l-autoloader xieraq. Peress li dan l-autoloader jaħdem ma' kull talba, jagħmel parti mill-ewwel affarijiet li jiġu vverifikati wara inċident tas-sigurtà.
Għaliex PHP jeħtieġ namespaces
In-namespaces jeżistu minn PHP 5.3.0. Qabel, il-klassijiet u l-funzjonijiet kollha kienu jaqsmu spazju wieħed globali tal-ismijiet. Jekk żewġ libreriji kienu jissejħu Logger, kien jiġri kollass. L-iżviluppaturi kienu jgħinu lilhom infushom b'ismijiet twal bħal Firma_Modul_Unterbereich_Logger.
Il-manwal ta' PHP isemmi żewġ problemi li jsolvu n-namespaces: kolliżjonijiet tal-ismijiet bejn kodiċi proprju, klassijiet interni ta' PHP u libreriji ta' terzi, kif ukoll ismijiet twal żżejjed li nħolqu biss biex jiġu evitati dawn il-kolliżjonijiet. Għal min jieħu d-deċiżjonijiet dan ifisser: biss in-namespaces għamluha prattikabbli li jinġabru għexieren ta' pakketti barranin fi proġett wieħed, kif illum huwa komuni b'Composer.
Namespaces fil-prattika: namespace, use, aliases
Fajl jiddikjara n-namespace tiegħu fl-ewwel istruzzjoni. B'use wieħed iġib klassijiet minn namespaces oħra, jekk irid taħt isem iqsar.
<?php
declare(strict_types=1);
namespace App\Rechnung;
use App\Kunde\Kunde;
use Psr\Log\LoggerInterface as Log;
final class PdfErzeuger
{
public function __construct(private Log $log) {}
public function erzeugen(Kunde $kunde): string
{
$this->log->info('PDF erzeugt', ['kunde' => $kunde->id]);
return \sprintf('Rechnung für %s', $kunde->name);
}
}
L-isem sħiħ ta' din il-klassi huwa App\Rechnung\PdfErzeuger. Il-backslash fil-bidu ta' \sprintf jirreferi espliċitament għall-funzjoni globali ta' PHP.
Autoloading: tagħbija tal-klassijiet meta jkun hemm bżonn
Mingħajr autoloading kull skript kellu jinkludi l-fajls kollha meħtieġa b'require. Minflok, b'spl_autoload_register() wieħed jirreġistra funzjoni li PHP isejjaħ hekk kif tintuża klassi, interface, trait jew enum mhux magħrufa. Din tirċievi l-isem tal-klassi u tgħabbi l-fajl xieraq.
<?php
spl_autoload_register(function (string $klasse): void {
$praefix = 'App\\';
$basis = __DIR__ . '/src/';
if (!str_starts_with($klasse, $praefix)) {
return; // mhux kompetenti, jmiss l-autoloader li jmiss
}
$datei = $basis . str_replace('\\', '/', substr($klasse, strlen($praefix))) . '.php';
if (is_file($datei)) {
require $datei;
}
});
spl_autoload_register() jista' jissejjaħ diversi drabi. PHP mbagħad jistaqsi lill-autoloaders irreġistrati wieħed wara l-ieħor sakemm wieħed minnhom iġib il-klassi. Fil-prattika applikazzjonijiet kbar spiss ikollhom diversi minnhom: l-autoloader ta' Composer għal-libreriji, wieħed proprju taċ-CMS u oħrajn minn plugins jew moduli. Għall-amministraturi dan ifisser: liema kodiċi verament jittella' ma' talba jirriżulta mill-interazzjoni ta' dawn l-autoloaders kollha u mhux mill-istruttura tal-folders waħedha.
Il-manwal jiskoraġġixxi bil-qawwa t-tfigħ ta' exceptions f'autoloader; PSR-4 jipprojbih espliċitament. Il-funzjoni eqdem __autoload() ġiet immarkata bħala skaduta b'PHP 7.2.0 u tneħħiet b'PHP 8.0.0.
PSR-4: mill-isem tal-klassi sal-mogħdija tal-fajl
PSR-4 huwa standard tal-PHP-FIG. Isem sħiħ ta' klassi jibda b'namespace tal-manifattur. Prefiss tan-namespace jiġi assenjat lil direttorju bażi, il-bqija tal-isem jagħti subfolders, u l-fajl jispiċċa b'.php. L-użu ta' ittri kbar u żgħar irid jaqbel eżatt. Hekk tidher l-assenjazzjoni fil-composer.json:
{
"autoload": {
"psr-4": { "App\\": "src/" }
}
}
| Isem tal-klassi | Fajl |
|---|---|
App\Kunde\Kunde |
src/Kunde/Kunde.php |
App\Rechnung\PdfErzeuger |
src/Rechnung/PdfErzeuger.php |
App\Rechnung\Pdf\Vorlage |
src/Rechnung/Pdf/Vorlage.php |
Ostaklu klassiku huwa l-użu ta' ittri kbar u żgħar. Fuq kompjuters tal-iżvilupp b'Windows jew macOS, is-sistema tal-fajls spiss ma tiddistingwix bejn Kunde.php u kunde.php, fuq server Linux iva. Applikazzjoni li taħdem lokalment mbagħad ma ssibx klassi fuq is-server. Ir-regola ta' PSR-4 li l-ismijiet jintużaw eżatt bl-ortografija korretta tevita sorpriżi bħal dawn waqt il-konsenja.
Minbarra psr-4, Composer jaf classmap għal kodiċi mingħajr struttura standard u files għal fajls li jitgħabbew ma' kull talba, pereżempju funzjonijiet ta' għajnuna. Standards oħra tal-PHP-FIG tiddeskrivihom il-paġna Standards PSR.
Ottimizzazzjoni tal-autoloader fil-produzzjoni
Fil-produzzjoni l-aħjar li l-autoloader ma jfittixx aktar fis-sistema tal-fajls, imma jikkonsulta lista lesta. Composer joffri żewġ livelli għal dan:
composer install --no-dev --optimize-autoloaderjittrasforma r-regoli PSR-4 f'lista tal-klassijiet. Dan huwa rakkomandat għall-produzzjoni skont id-dokumentazzjoni ta' Composer.--classmap-authoritativeimur aktar 'il quddiem: il-klassijiet jitgħabbew esklussivament mil-lista. Fajls li mhumiex elenkati l-autoloader mbagħad ma jgħabbihomx xejn.- Ma' kull konsenja l-lista tiġi ġġenerata mill-ġdid, biex klassijiet ġodda jinstabu.
Autoloading u sigurtà wara PHP2Shell
PHP2Shell jaffettwa l-interpretatur ta' PHP, mhux l-autoloader. Jibqgħu obbligatorji l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35 u r-restart tal-workers kollha. Wara inċident possibbli, madankollu, l-autoloader jistħoqqlu attenzjoni speċjali: vendor/autoload.php u l-fajls kollha rreġistrati taħt files jiġu eżegwiti ma' kull talba. Linja injettata hemmhekk għalhekk taffettwa l-websajt kollha, mingħajr ma jkun hemm fajl ġdid li jidher fil-folder tal-uploads.
Iċċekkjaw għalhekk jekk vendor u l-fajls tal-autoload jaqblux mal-istat ivverifikat mill-kontroll tal-verżjonijiet. Utli huma l-artikoli Sib il-fajls li nbidlu dan l-aħħar u Qabbel il-fajls tal-qalba taċ-CMS mal-oriġinal. Fil-każ ta' dubju, vendor maħluq mill-ġdid mill-fajl lock huwa aktar sigur minn kull tiswija individwali.
Kif jgħin PHP SOS konkretament?
- Inqabblu
vendor, l-autoloader u l-fajls ta' dħul mal-istat ivverifikat u nimmarkaw kull diverġenza. - Nerġgħu nibnu l-istokk tal-pakketti mill-fajl lock u nwaqqfu autoloader ottimizzat.
- Niċċekkjaw jekk fil-webroot jinsab biss il-folder pubbliku u jekk il-kodiċi sors mhuwiex aċċessibbli direttament b'URL.
- F'każ ta' infezzjoni nieħdu f'idejna t-tindif bħala parti mit-tneħħija tal-malware u niddokumentaw ir-riżultat.
Mistoqsijiet frekwenti
Minn meta teżisti namespaces f'PHP?
Minn PHP 5.3.0. Skont il-manwal isolvu żewġ problemi: kolliżjonijiet tal-ismijiet bejn kodiċi proprju, PHP u libreriji ta' terzi, kif ukoll ismijiet twal żżejjed tal-klassijiet li nħolqu biss biex jiġu evitati tali kolliżjonijiet.
X'inhi d-differenza bejn PSR-0 u PSR-4?
It-tnejn jimmappjaw ismijiet ta' klassijiet fuq mogħdijiet ta' fajls. Fil-każ ta' PSR-4 il-prefiss tan-namespace ma jiġix ripetut fil-mogħdija tal-fajl, u dan jagħti direttorji irqaq. PSR-0 huwa kklassifikat mill-PHP-FIG bħala skadut, PSR-4 huwa l-istandard rakkomandat.
__autoload() għadu jaħdem?
Le. __autoload() ġie mmarkat bħala skadut b'PHP 7.2.0 u tneħħa b'PHP 8.0.0. Illum l-autoloaders jiġu rreġistrati b'spl_autoload_register(), fil-prattika l-aktar permezz tal-autoloader iġġenerat minn Composer.
Għandi nerġa' niġġenera l-autoloader wara li noħloq klassi ġdida?
B'regoli PSR-4 purament, le; skont id-dokumentazzjoni ta' Composer dan huwa preċiżament vantaġġ ta' PSR-4. Min juża fil-produzzjoni lista ottimizzata tal-klassijiet, irid jerġa' jiġġenerha ma' kull konsenja.