How to do a PHP hook system?

后端 未结 3 2211
后悔当初
后悔当初 2020-12-12 21:30

How do you impliment a hook system in a PHP application to change the code before or after it executes. How would the basic architecture of a hookloader class be for a PHP

相关标签:
3条回答
  • 2020-12-12 21:54

    this solutions has some problems that you can't set several function for one callable hook. you can fallow this code.

    
    
     $action = [];
    
     function apply($hook, $args){
        global $action;
        $action[$hook]['args'] = $args;
        return doa($hook, $args);
     }
    
     function add($hook, $func){
        global $action;
        $action[$hook]['funcs'][] = $func;
     }
    
     function doa($hook,$args){
        global $action;
        if(isset($action[$hook]['funcs'])){
            foreach($action[$hook]['funcs'] as $k => $func){
                call_user_func_array($func, $args);
           }
        }
        
     }
    
     add('this_is', 'addOne');
    function addOne($user){
        echo "this is test add one $user <br>";
    }
    add('this_is', function(){
        echo 'this is test add two <br>';
    });
    
    
    add('this_is_2', 'addTwo');
    function addTwo($user, $name){
        echo $user . '   ' . $name . '<br>';
    }
    
    
    function test(){
        echo 'hello one <br>';
        apply('this_is', ['user'=> 123]);
    }
    
    
    function test2(){
        echo 'hello two <br>';
        apply('this_is_2', ['user'=> 123, 'name' => 'mohammad']);
    }
    test();
    test2();
    
    
    
    
    0 讨论(0)
  • 2020-12-12 21:55

    Here's another solution:

    Creating a hook

    Run this wherever you want to create a hook:

    x_do_action('header_scripts');


    Attach a function to the hook

    Then attach a function to the above by doing:

    x_add_action('header_scripts','my_function_attach_header_scripts');
    
    function my_function_attach_header_scripts($values) {
    
       /* add my scripts here */
    
    }
    

    Global variable to store all hooks/events

    Add this to the top of your main PHP functions file, or equivalent

    $x_events = array();
    global $x_events;
    

    Base functions

    function x_do_action($hook, $value = NULL) {
        global $x_events;
    
        if (isset($x_events[$hook])) {
    
            foreach($x_events[$hook] as $function) {
    
                if (function_exists($function)) { call_user_func($function, $value); }
    
            }
        }
    
    }
    
    function x_add_action($hook, $func, $val = NULL) {
        global $x_events;
        $x_events[$hook][] = $func;
    
    }
    
    0 讨论(0)
  • 2020-12-12 21:57

    You can build an events system as simple or complex as you want it.

    /**
     * Attach (or remove) multiple callbacks to an event and trigger those callbacks when that event is called.
     *
     * @param string $event name
     * @param mixed $value the optional value to pass to each callback
     * @param mixed $callback the method or function to call - FALSE to remove all callbacks for event
     */
    function event($event, $value = NULL, $callback = NULL)
    {
        static $events;
    
        // Adding or removing a callback?
        if($callback !== NULL)
        {
            if($callback)
            {
                $events[$event][] = $callback;
            }
            else
            {
                unset($events[$event]);
            }
        }
        elseif(isset($events[$event])) // Fire a callback
        {
            foreach($events[$event] as $function)
            {
                $value = call_user_func($function, $value);
            }
            return $value;
        }
    }
    

    Add an event

    event('filter_text', NULL, function($text) { return htmlspecialchars($text); });
    // add more as needed
    event('filter_text', NULL, function($text) { return nl2br($text); });
    // OR like this
    //event('filter_text', NULL, 'nl2br');
    

    Then call it like this

    $text = event('filter_text', $_POST['text']);
    

    Or remove all callbacks for that event like this

    event('filter_text', null, false);
    
    0 讨论(0)
提交回复
热议问题