Today I used spl_autoload_register again.
This time to load default concrete classes. For example in my framework I have a class called SlibUser:
class SlibUser extends SlibRecord { public static function Load( $id ) { $args = array( 'id' => $id ); $data = db()->get_row( 'select * from /*prefix*/user where id = :id', $args ); if ( $data ) { return new User( $data ); } return null; } }
As you can see SlibUser creates a new User. That User can be provisioned by a user of my framework, but if they don’t specify a particular User definition I give them a default implementation with spl_autoload_register, e.g.:
<?php function load_slib_mock( $class = false ) { //var_dump( $class ); static $classes; static $files; if ( ! $files ) { $files = array(); } if ( ! $classes ) { $classes = array( // URL 'Uri', 'UriPath', 'UriPathBuilder', 'UriQuery', 'UriQueryBuilder', 'UriQueryNode', // framework: 'Auth', 'Column', 'FrontController', 'Option', 'OptionGroup', 'ResourceManager', 'Schema', 'Settings', 'Table', 'Variable', // database: 'Database', 'DatabaseUpgrader', // ORM: 'Browser', 'GeoipLocation', 'HttpAccept', 'HttpAcceptEncoding', 'HttpAcceptLanguage', 'HttpMethod', 'HttpUserAgent', 'Partition', 'Request', 'Role', 'Session', 'SessionSettings', 'User', 'UserPartition', 'UserSettings' ); } if ( ! in_array( $class, $classes ) ) { return false; } $path = "/var/tmp/slib-$class.php"; if ( ! file_exists( $path ) ) { $content = "<?php class $class extends Slib$class {}"; $file = fopen( $path, 'w' ); if ( ! $file ) { throw new IOException( "Cannot write '$file'." ); } fwrite( $file, $content ); fclose( $file ); } require_once( $path ); return true; } // autoload handler: spl_autoload_register( 'load_slib_mock', true, true );