automatisation d'évenements dans une classe

Eléphant du PHP | 79 Messages

01 juil. 2013, 13:59

Bonjour à toutes et à tous,

Voici un petite classe qui me permet d'automatiser certain méthode dans une classe, je l'exploite dans divers projets, comme celui de mon framework perso pour la gestion des bootstraps et controllers.

La classe mère :
<?php

class ma_class_mere
{
    private $options ;
    
    private function call( $prefix )
    {
        $object = new ReflectionClass( $this );
        
        foreach( $object-> getMethods( ReflectionMethod::IS_PUBLIC ) as $method )
        {
            $method_name = $method-> getName();
            
            if( substr( $method_name, 0, strlen( $prefix ) ) == $prefix )
            {
                call_user_func( array( $this, $method_name ) );
            }
        }
    }
    
    public function __construct( $options = array() )
    {
        $this-> options = $options ;
        
        $this-> call( 'init_' );
    }
    
    public function __set( $key, $value )
    {
        $this-> options[$key] = $value ;
    }
    
    public function __get( $key )
    {
        $result = null ;
        
        if( array_key_exists( $key, $this-> options ) )
        {
            $result = $this-> options[$key];
        }
        
        return $result ;
    }
    
    public function __isset( $key )
    {
        return isset( $this-> options[$key] );
    }
    
    public function __unset( $key )
    {
        if( array_key_exists( $key, $this-> options ) )
        {
            unset( $this-> options[$key] );
        }
    }
    
    public function render()
    {
        $this-> call( 'run_' );
        
        return $this-> options ;
    }
}

Exemple de classe fille qui hérite de la classe mère :
<?php

class ma_class_file extends ma_class_mere
{
    public function inti_request()
    {
        $this-> request = $_SERVER['REDIRECT_URL'];
    }
    
    public function start_request( $int )
    {
        $this-> step =  $int ;
    }
    
    public function run_request()
    {
        $array = explode( '/', trim( $this-> request, '/' ) );
        
        $this-> request = array_slice( $array, $this-> step );
    }
}

?>
Avec ce système toutes classes fille à "ma_class_mere" verra les méthode commençant par "init_" (dans un ordre croissant) ce lancer à l'instanciation et verra les méthodes commençant par "run_" (dans un ordre croissant) ce lancer lors de l'appel de la fonction "render()". J'ai aussi utilisé les méthodes magiques __set, __get, __unset, __isset pour render cette classe plus sympa en terme de gestion d'informations, comme ça d'une classe fille à une autre vous pourrez transmettre des informations via le tableau d'options.

Ciao