jcarney1987 Posted July 26, 2023 Share Posted July 26, 2023 (edited) okay, so here is my question in regards to this autoload script. So let's say my files in my classes folder is hello.class.inc and my class is defined as class Hello{ //some code here } So I noticed in a file where I call upon class such as $var = new Hello(); I would get an error saying "Hello.class.php" doesn't exist but if I rename the class with a capital H in Hello.class.php it will work. So what is going on here that causes that? <?php spl_autoload_register('myAutoLoader'); function myAutoloader ($className){ $url = $SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; if(strpos($url, 'includes' ) !== false) { $path = '../classes/'; } else { $path = 'classes/'; } $extension = '.class.php'; require_once $path . $className . $extension; } ?> Edited July 26, 2023 by jcarney1987 Quote Link to comment Share on other sites More sharing options...
Strider64 Posted July 26, 2023 Share Posted July 26, 2023 (edited) My suggestion is to use composer https://getcomposer.org/ as it will save you a lot a headaches and you don't have to reinvent the wheel. Then you can just do something like the following -> <?php // Include the configuration file and autoload file from the composer. require_once __DIR__ . '/../config/config.php'; require_once "vendor/autoload.php"; // Import the ErrorHandler and Database classes from the PhotoTech namespace. use brainwave\{ ErrorHandler, Database, Links, ImageContentManager, LoginRepository as Login }; // Instantiate the ErrorHandler class $errorHandler = new ErrorHandler(); // Set the exception handler to use the handleException method from the ErrorHandler instance set_exception_handler([$errorHandler, 'handleException']); // Create a new instance of the Database class $database = new Database(); // Create a PDO instance using the Database class's method $pdo = $database->createPDO(); $login = new Login($pdo); if ($login->check_login_token()) { header('location: dashboard.php'); exit(); } $cms = new ImageContentManager($pdo); a sample class -> <?php // ErrorHandler.php namespace brainwave; use PDOException; use Throwable; use JsonException; class ErrorHandler implements ErrorHandlerInterface { public function handleException(Throwable $e): void { if ($e instanceof PDOException) { error_log('PDO Error: ' . $e->getMessage()); } elseif ($e instanceof JsonException) { error_log('JSON Error: ' . $e->getMessage()); } else { error_log('General Error: ' . $e->getMessage()); } } } I would also check out namespace for PHP classes. Edited July 26, 2023 by Strider64 1 Quote Link to comment Share on other sites More sharing options...
kicken Posted July 27, 2023 Share Posted July 27, 2023 14 hours ago, jcarney1987 said: So what is going on here that causes that? Some filesystems are case-sensitive, so Hello.class.php and hello.class.php are two completely separate files. You need to either ensure you are using the correct case when creating and referencing your files, or normalize the case in some way (such as making everything lowercase). 1 Quote Link to comment Share on other sites More sharing options...
jcarney1987 Posted July 28, 2023 Author Share Posted July 28, 2023 so I guess I don't understand the internals of spl_autoload_register. So if I call for Class Hello { //some code here } it looks for the file based on class name. I was thinking it slurps up the class directory searching for the class then including it. Quote Link to comment Share on other sites More sharing options...
Solution kicken Posted July 28, 2023 Solution Share Posted July 28, 2023 1 hour ago, jcarney1987 said: so I guess I don't understand the internals of spl_autoload_register There are no internals of spl_autoload_register with regards to the locating and loading of a class. All the details of how that is done is up to the function you provide. All spl_autoload_register does is add your function to a list of functions that get called when an unknown class is referenced. Your function gets the fully qualified name of the class and has to use that to define that class, typically by converting the name to a file location and including that file. Your example essentially just uses the class name as-is as a file path and attempts to include that file. Since your class is defined as Hello then you get a filename of Hello.class.php with a capital H. Your actual filename however seems to be hello.class.php with a lower-case H. On a case-insensitive filesystem such as windows' ntfs, this would be fine and the file would be loaded. On a case-sensitive filesystem such as linux ext4, this is a problem and the file will fail to load. As mentioned, typically one would just use composer to handle class autoloading rather than defining your own function. Combine it with the PSR-4 standard (and ensure you get your case correct) and you mostly don't have to think about it at all. 1 Quote Link to comment Share on other sites More sharing options...
jcarney1987 Posted July 30, 2023 Author Share Posted July 30, 2023 Yes, I do use Linux as my Base system and I plan on using Linux and FreeBSD as my base WebServers. Composer does sound great in the long run, right now I'm more concerned with learning and understanding the language better before I break off and start learning package managers and frameworks. It's all good stuff. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.