批改状态:合格
老师批语:
方法重载与call_user_func_array()
1)方法重载:
class Test
{
//普通方法的重载(如果没有__call方法,就不能在外部访问私有方法)
public function __call($name, $arguments)
{
// return $name; //方法名称
// return $arguments;
$arrs = implode(',',$arguments);
return '方法名:'.$name.'<br>参数:'.$arrs;
}
//创建一个私有方法
private function select()
{
return __METHOD__;
}
//静态方法的重载
public static function __callStatic($name, $arguments)
{
$arrs = implode(',',$arguments);
return '方法名:'.$name.'<br>参数:'.$arrs;
}
}
//实例化
$test = new Test;
//访问一个不存在的非静态/普通/动态方法
//echo $test->show();
print_r($test->show('合肥','杭州'));
echo $test->select('staff','id,name,age').'<hr>';
//从类外部访问一个不存在的静态方法
echo Test::assign('html,css,php');2) call_user_func_array():
//场景一:执行回调函数
//计算两个整数之和
echo call_user_func_array(function($m,$n){return $m+$n;},[10,20]).'<hr>';
//场景二:执行对象方法
class Hello1
{
public function add($m,$n)
{
return $m + $n;
}
}
//call_user_func_array([对象,'方法'],[参数数组])
//$obj = new Hello1();
//$method = 'add';
//$args = [30,50];
//echo call_user_func_array([$obj,$method],$args),'<br>';
//可以简写:
echo call_user_func_array([(new Hello1()),'add'],[35,40]).'<hr>';
//场景三:执行类中的静态方法
class Hello2
{
public static function add($m,$n)
{
echo $m + $n;
}
}
//Hello2::add(20,30); 数组[类名,方法],[]
call_user_func_array(['Hello2','add'],[40,20]).'<hr>';2.后期静态绑定案例
class Db1
{
public static $pdo = null;
public static function connect()
{
self::$pdo = new PDO('mysql:host=127.0.0.1;dbname=php','root','root');
}
public static function query()
{
$stmt = self::$pdo->prepare("SELECT `name`,`salary` FROM `staff` LIMIT 3");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
public static function select()
{
self::connect();
return self::query();
}
}
class Db2 extends Db1
{
public static function query()
{
$stmt = self::$pdo->prepare("SELECT `name` AS `姓名`,`email` AS `邮箱` FROM `user` LIMIT 3");
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
echo '<pre>';
print_r(Db1::select());
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号