Skip to content

{ Tag Archives } 子类,父类

PHP call_user_func和call_user_func_array详解

call_user_func 函数类似于一种特别的调用函数的方法,使用方法如下:

function a($b, $c) {
    echo $b;
    echo $c;
}
call_user_func('a', "111","222");
call_user_func('a', "333","444");

//显示 111 222 333 444

调用类内部的方法用的是array

class a {
    function b($c) {
        echo $c;
    }
}
call_user_func(array("a", "b"), "111");

//显示 111

call_user_func_array 函数和 call_user_func 很相似,只不过是换了一种方式传递了参数,让参数的结构更清晰:

function a($b, $c) {
    echo $b;
    echo $c;
}
call_user_func_array('a', array("111", "222"));

//显示 111 222

call_user_func_array 函数也可以用于调用类内部方法

Class ClassA {
    function bc($b, $c) {
        $bc = $b + $c;
        echo $bc;
    }
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));

//显示 333

call_user_func 函数和 call_user_func_array 函数支持引用

function a(&$b) {
    $b++;
}
$c = 0;
call_user_func('a', &$c);
echo $c;    //显示 1
call_user_func_array('a', array(&$c));
echo $c;    //显示 2

PHP手册上关于这两个函数的定义:
mixed call_user_func (callback function [, mixed parameter [, mixed ...]])

Call a user defined function given by the function parameter. Take the following:

function barber($type) {
    echo "You wanted a $type haircut, no problem";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");

Object methods may also be invoked statically using this function by passing array($objectname, $methodname) to the function parameter.

class myclass {
    function say_hello() {
        echo "Hello!\n";
    }
}

$classname = "myclass";

call_user_func(array($classname, 'say_hello'));

注: Note that the parameters for call_user_func() are not passed by reference.

function increment(&$var) {
    $var++;
}

$a = 0;
call_user_func('increment', $a);
echo $a;    // 0

call_user_func_array('increment', array(&$a)); // You can use this instead
echo $a;    // 1

mixed call_user_func_array( callback function, array param_arr )
Call a user defined function given by function, with the parameters in param_arr. For example:

call_user_func_array() example

function debug($var, $val) {
    echo "***DEBUGGING\n VARIABLE: $var\nVALUE:";
    if (is_array($val) || is_object($val) || is_resource($val)) {
        print_r($val);
    } else {
        echo "\n$val\n";
    }
    echo "***\n";
}

$c = mysql_connect();
$host = $_SERVER["SERVER_NAME"];

call_user_func_array('debug', array("host", $host));
call_user_func_array('debug', array("c", $c));
call_user_func_array('debug', array("_POST", $_POST));

这篇其实转载的(不好意思,忘了是来自哪…)上面有提到说,最后的这个函数有点相当于重载,看了下,确实有那么点重载的意思…

Also tagged ,

PHP 检测父类子类函数

string get_class(object obj)
返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE。
注: get_class() 返回用户定义的类名的小写形式。在 PHP 扩展中定义的类则返回其原有的名字。

string get_parent_class(mixed obj)
如果 obj 是对象,则返回对象实例 obj 所属类的父类名。
如果 obj 是字符串,则返回以此字符串为名的类的父类名。此功能是在 PHP 4.0.5 中增加的。

bool is_subclass_of(object object, string class_name)
如果对象 object 所属类是类 class_name 的子类,则返回 TRUE,否则返回 FALSE。

bool is_a(object object, string class_name)
如果对象是该类或该类是此对象的父类则返回 TRUE,否则返回 FALSE。

Also tagged ,