What are some best practices for organizing classes and including external classes like Smarty in PHP projects?

When organizing classes in PHP projects, it is important to follow a consistent naming convention and directory structure. This helps in easily locating and managing classes within the project. When including external classes like Smarty, it is recommended to use autoloading to automatically load classes when they are needed, instead of manually including them in each file.

// Autoloading classes using PSR-4 standard
spl_autoload_register(function ($class) {
    // project-specific namespace prefix
    $prefix = 'MyApp\\';

    // base directory for the namespace prefix
    $base_dir = __DIR__ . '/src/';

    // does the class use the namespace prefix?
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        // no, move to the next registered autoloader
        return;
    }

    // get the relative class name
    $relative_class = substr($class, $len);

    // replace the namespace prefix with the base directory, replace namespace separators with directory separators
    $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

    // if the file exists, require it
    if (file_exists($file)) {
        require $file;
    }
});