About Jay Jay

Hi there. My name is John Elliot V. My friends call me Jay Jay. I talk about technology on my blog at blog.jj5.net and make videos about electronics on my YouTube channel @InTheLabWithJayJay.

PHP spl_autoload_register

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 );

Videos I watched recently

Processing archives

I’m de-duplicating my archives. I processed 3.6 million files and then crashed:

Symlinks: 30,836
Directories: 513,860
Files: 3,665,000
Hardlinks: 2,241,681
Duplicates: 55,309

Time to start again. Duplicates that have already been processed will show up as unduplicated files on this next iteration… my script is here.

And now we’re finished:

Symlinks: 31,926
Directories: 2,071,219
Files: 11,682,777
Hardlinks: 8,034,685
Duplicates: 669,452
Rate: 3555.44 files/second