【发布时间】:2022-01-22 07:40:17
【问题描述】:
我尝试使用php mvc,我该如何解决这个错误?
致命错误:未捕获的类型错误:call_user_func():参数 #1 ($callback) 必须是有效回调,数组在 C:\xampp\htdocs\03_good\Router.php:53 中必须恰好有两个成员 堆栈跟踪:
#0 C:\xampp\htdocs\03_good\Router.php(53): call_user_func(Array, Object(app\Router))
#1 C:\xampp\htdocs\03_good\public\index.php(20): app\Router->resolve()
#2 {main} 在第 53 行的 C:\xampp\htdocs\03_good\Router.php 中抛出
这是我的Router:
<?php
/**
* User: TheCodeholic
* Date: 10/11/2020
* Time: 10:05 AM
*/
namespace app;
/**
* Class Router
*
* @author Zura Sekhniashvili <zurasekhniashvili@gmail.com>
* @package app
*/
class Router
{
public array $getRoutes = [];
public array $postRoutes = [];
public ?Database $database = null;
public function __construct(Database $database)
{
$this->database = $database;
}
public function get($url, $fn)
{
$this->getRoutes[$url] = $fn;
}
public function post($url, $fn)
{
$this->postRoutes[$url] = $fn;
}
public function resolve()
{
$method = strtolower($_SERVER['REQUEST_METHOD']);
$url = $_SERVER['PATH_INFO'] ?? '/';
if ($method === 'get') {
$fn = $this->getRoutes[$url] ?? null;
} else {
$fn = $this->postRoutes[$url] ?? null;
}
if (!$fn) {
echo 'Page not found';
exit;
}
echo call_user_func([$fn], $this);
}
public function renderView($view, $params = [])
{
foreach ($params as $key => $value) {
$$key = $value;
}
ob_start();
include __DIR__."/views/$view.php";
$content = ob_get_clean();
include __DIR__."/views/_layout.php";
}
}
这是index.php:
<?php
use app\controllers\ProductController;
use app\Router;
require_once __DIR__.'/../vendor/autoload.php';
$database = new \app\Database();
$router = new Router($database);
$router->get('/', [ProductController::class, 'index']);
$router->get('/products', [ProductController::class, 'index']);
$router->get('/products/index', [ProductController::class, 'index']);
$router->get('/products/create', [ProductController::class, 'create']);
$router->post('/products/create', [ProductController::class, 'create']);
$router->get('/products/update', [ProductController::class, 'update']);
$router->post('/products/update', [ProductController::class, 'update']);
$router->post('/products/delete', [ProductController::class, 'delete']);
$router->resolve();
【问题讨论】:
-
您需要检查
$fn以确保它是可调用的。您正在手动将该变量包装在一个数组中,这需要吗?已经是数组了吗? -
array(2) { [0]=> string(33) "app\controllers\ProductController" [1]=> string(5) "index" }这是$fn的值 -
看看那个,我想你可以改成
echo call_user_func($fn, $this);,去掉它周围的方括号。 -
我去掉了那个括号但是这个错误还没有修复
-
请分享更多细节。去掉括号后的错误信息真的完全一样吗?另外,那个 ProductController 类包含什么?