# Module Class Autoloading

Module class autoloading enables the automatic loading of classes stored in a prescribed way in WHMCS modules. It is provided as a tool to make it easier for module developers to create helper classes. They can then call on and load these modules throughout the WHMCS product from modules, hooks, and other custom integration code.

**Note**: This is **not** intended to be a replacement for modern PHP development practices like the use of Composer or more complex custom-made autoloaders.

## Supported Module Types

The following module types support autoloading:

* Addon
* Fraud
* Gateway
* Registrar
* Report
* Server
* Widget


## Usage

Store your class file(s) in a `lib` subdirectory that is relative to the deployed module. For example:

```
/path/to/whmcs/modules/{ModuleType}/{ModuleName}/lib/{ClassName}.php
```

Add the module namespace to the top of your class file(s):

```
namespace WHMCS\Module\{ModuleType}\{ModuleName};
```

To invoke the class, add the `use` statement and invoke it normally:

```
use WHMCS\Module\{ModuleType}\{ModuleName}\{ClassName};

$hello = new {ClassName}();
```

**Note**: For module types that do not have a directory per module by default (for example, gateways and reports), you will need to create the directory and subdirectory `lib` to use autoloading.

## Example Usage

The following example demonstrates module namespace autoloading for a class named `HelloWorld` within the `Sample Addon Module` module:

### `/modules/addons/sample_addon_module/lib/HelloWorld.php`

```
namespace WHMCS\Module\Addon\SampleAddonModule;

/**
 * Hello World Class
 *
 * @copyright Copyright (c)
 * @license http://www.whmcs.com/license/ WHMCS Eula
 */
class HelloWorld {

    /**
     * Print hello world.
     */
    public function printHello()
    {
        print 'Hello World';
    }

}
```

### `/modules/addons/sample_addon_module/sample_addon_module.php`

```
use WHMCS\Module\Addon\SampleAddonModule\HelloWorld;

// Other code goes here...

function sample_addon_module_output() {
    $hello = new HelloWorld();
    $hello->printHello();
}
```