Eie funksie vir outolading van klasse in OOP in PHP
Dikwels kan die verstek outolaai-funksie jou nie pas om die een of ander rede nie. In sulke gevalle kan jy jou eie outolaai-funksie skryf.
Om dit te doen, moet jy jou geskrewe
terugroep-funksie as die eerste parameter aan die funksie spl_autoload_register
oorgee. Hierdie funksie sal geroep word
wanneer PHP 'n verwysing na 'n
ongelaaide klas opmerk. Die naam van die klas met naamspasie
sal in die parameter van hierdie funksie aangegee word:
<?php
spl_autoload_register(function($class) {
// in die veranderlike $class sal die klassenaam met naamspasie wees
});
?>
En die plig van die funksie is om die klas te laai
deur require, gebaseer op die klassenaam.
Dat wil sê, binne hierdie funksie moet ons
ons eie reël vir die laai van klasse spesifiseer, dit is
ons eie naamkonvensie.
Kom ons skryf 'n voorbeeld van 'n eie outolaai-funksie. Laat ons byvoorbeeld sê dat die pad na die klaslêer vanaf die wortel van die webwerf dieselfde sal wees as die naamspasie, maar met die behoud van hoof- en kleinletters.
Dit wil sê, as ons 'n klas Core\Admin\PageController het,
dan moet die pad daartoe Core/Admin/PageController.php wees.
Soos jy kan sien, om die klassenaam
met sy naamspasie om te skakel, moet jy net die
agterwaartse skuinsstrepe na vorentoe skuinsstrepe verander, en by die klassenaam
.php voeg. Laat ons dit doen:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ons sal egter 'n relatiewe pad na die lêer kry (relatief tot die webwerf se wortel). Dit is beter om 'n absolute pad te maak, soos volg:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Daar is nog 'n fyn punt. In verskillende bedryfstelsels
kan die pad deur vouers met 'n vorentoe skuinsstreep
of met 'n agterwaartse skuinsstreep wees. Laat ons ons kode onafhanklik maak
van die bedryfstelsel. Om dit te doen, plaas ons
die konstante DIRECTORY_SEPARATOR in die plek van
die vorentoe skuinsstreep om paaie te skei.
Dit bevat die korrekte skuinsstreep vir die bedryfstelsel
waarin ons skrip tans uitgevoer word. Uiteindelik kry ons die volgende kode:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Toets die outolaai-funksie wat ek geskep het.
Bedenk jou eie outolaai-reël en implementeer dit.