首页 » PHP » PHP - 函数

PHP函数

PHP函数指针

PHP中没有真正的指针,也就无所谓函数指针了。C/C++中的函数回调,将以另一种古怪的形式出现:

function add($a, $b) 
{
    return ($a + $b);
}

$f = "add";
echo $f(1, 2) . "\n";

用一个变量存储函数名(字符串),再以函数调用的形式用这个变量。这种做法的本质是:

echo call_user_func($f, 1, 2) . "\n";
echo call_user_func("add", 1, 2) . "\n";

要实现函数回调/函数指针,PHP提供了2个函数:

call_user_func($callback [,$parameter [,$parameter2...]])
call_user_func_array($callback, $parameters_array)

要实现常见的事件处理分派机制(伪代码如下),就可以用这2个函数辅助实现。

run($event, $paramters) {
    $if($event is registered) {   // $event => $handler
        $handler = $handlers[$event];
        $handler($paramters);
    }
}

接下来是一份简单的实现代码:

Step1: 事件分配器:

class dispatcher
{
    static $handlers = array();

    static function add($event, $handler)
    {
        self::$handlers[$event] = $handler;
    }

    static function run($event, $params)
    {
        $handlers = self::$handlers;
        if(array_key_exists($event, $handlers)) {
            $f = $handlers[$event];
            return call_user_func_array($f, $params);
        }
    }
}

Step2: 事件处理函数实现,并注册到分配器中:

function create_order($username, $city)
{
    echo "create order for $username, City: $city\n";
}

dispatcher::add("submit_new_order", "create_order");

Step3: 事件来临时,让分配器自动寻找处理函数执行之:

$action = "submit_new_order";
dispatcher::run($action, array("berlinix", "Beijing"));

assert_options()

PHP中assert()支持自定义回调:

assert_options(ASSERT_CALLBACK, callback);

注意第二个参数需要传入一个函数(名),当Assert失败时会调用它,如:

function my_assert($file, $line, $code)
{
    echo "MY ASSERT FAILED: $file:$line\n";
}

assert_options(ASSERT_WARNING, false);          /* disable PHP warning for failed assertion */
assert_options(ASSERT_CALLBACK, "my_assert");

assert(is_float("not float"));

输出:

$ php assert.php 
MY ASSERT FAILED: /home/berlinix/codes/learn-php/assert.php:11

分享

0