Δική σας συνάρτηση για αυτόματη φόρτωση κλάσεων στην OOP στην PHP
Συχνά η προεπιλεγμένη αυτόματη φόρτωση μπορεί να μη σας ικανοποιεί για κάποιους λόγους. Σε τέτοια περίπτωση μπορείτε να γράψετε τη δική σας αυτόματη φόρτωση.
Για να το κάνετε αυτό, στη συνάρτηση spl_autoload_register
πρέπει να περάσετε ως πρώτη παράμετρο την συνάρτηση-callback που γράψατε.
Αυτή η συνάρτηση θα καλείται
όταν η PHP ανιχνεύει πρόσβαση σε
μια μη φορτωμένη κλάση. Στην παράμετρο αυτής της συνάρτησης
θα περνάει το όνομα της κλάσης με το χώρο ονομάτων:
<?php
spl_autoload_register(function($class) {
// στη μεταβλητή $class θα είναι το όνομα της κλάσης με το χώρο ονομάτων
});
?>
Και το καθήκον της συνάρτησης είναι με βάση το όνομα της κλάσης
να εκτελέσει τη φόρτωση αυτής της κλάσης μέσω του require.
Δηλαδή μέσα σε αυτή τη συνάρτηση πρέπει να ορίσουμε
τον δικό μας κανόνα για τη φόρτωση κλάσεων, δηλαδή
τη δική μας σύμβαση ονοματοδοσίας.
Ας γράψουμε ένα παράδειγμα μιας δικής μας αυτόματης φόρτωσης. Ας πούμε, για παράδειγμα, ότι ορίζουμε ότι η διαδρομή προς το αρχείο της κλάσης από τη ρίζα του site θα είναι η ίδια με το χώρο ονομάτων, αλλά με διατήρηση της πεζοκεφαλαίας των συμβόλων.
Δηλαδή, εάν έχουμε την κλάση Core\Admin\PageController,
τότε η διαδρομή προς αυτήν πρέπει να είναι Core/Admin/PageController.php.
Όπως βλέπετε, για τον μετασχηματισμό του ονόματος της κλάσης
μαζί με το χώρο ονομάτων της απλά πρέπει να αλλάξετε
τις ανάποδες πλάγιες σε ευθείες, και στο όνομα της κλάσης
να προσθέσετε .php. Ας το κάνουμε αυτό:
<?php
spl_autoload_register(function($class) {
$filename = str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Ωστόσο, θα προκύψει σχετική διαδρομή προς το αρχείο (σε σχέση με τη ρίζα του site). Καλύτερα να κάνετε απόλυτη διαδρομή, έτσι:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
require($filename);
});
?>
Υπάρχει ακόμη μια λεπτότητα. Σε διαφορετικά λειτουργικά συστήματα
η διαδρομή μέσω φακέλων μπορεί να είναι με ευθεία πλάγια
ή με ανάποδη. Ας κάνουμε τον κώδικά μας ανεξάρτητο
από το λειτουργικό σύστημα. Για αυτό, αντί
για ευθεία πλάγια για διαχωρισμό διαδρομών θα βάζουμε
τη σταθερά DIRECTORY_SEPARATOR,
που περιέχει το σωστό διαχωριστικό εκείνου του λειτουργικού
συστήματος, στο οποίο τρέχει αυτή τη στιγμή το
σκηνοθετικό μας αρχείο. Στο τέλος θα πάρουμε τον ακόλουθο κώδικα:
<?php
spl_autoload_register(function($class) {
$root = $_SERVER['DOCUMENT_ROOT'];
$ds = DIRECTORY_SEPARATOR;
$filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
require($filename);
});
?>
Δοκιμάστε τη συνάρτηση αυτόματης φόρτωσης που δημιούργησα.
Σκεφτείτε τον δικό σας κανόνα αυτόματης φόρτωσης και υλοποιήστε τον.