Php 为什么可以';我不能在Slim的调用函数中使用$app吗?

Php 为什么可以';我不能在Slim的调用函数中使用$app吗?,php,json,slim,Php,Json,Slim,我试图创建一个可重用的函数,但每次我尝试在远程函数中使用$app时,都会出现一个空白屏幕。以下是工作原理: $app = new \Slim\Slim(); //GET CHAPTERS $app->get( '/chapters', function () use ($app) { $app->contentType('application/json'); executeSql('SELECT * FROM chapters OR

我试图创建一个可重用的函数,但每次我尝试在远程函数中使用$app时,都会出现一个空白屏幕。以下是工作原理:

$app = new \Slim\Slim();

//GET CHAPTERS
$app->get(
    '/chapters',
    function () use ($app) {
        $app->contentType('application/json');
        executeSql('SELECT * FROM chapters ORDER BY id');
    }
);

//GENERIC SQL EXECUTE
function executeSql($sql) {
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $results = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($results);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}
但我试图在函数中移动JSON头,不能让它工作(得到空白的白屏):


我的语法或如何使用PHP有什么问题吗?我也尝试过完全不使用“use($app)”,但仍然存在相同的问题。

除了使用名称空间之外,
use
关键字只适用于闭包构造。因此,不支持使用常规函数执行的操作。您必须使用
global$app
,这通常被认为是不好的做法。

您可以始终将$app对象作为参数传递给函数

$app = new \Slim\Slim();

//GET CHAPTERS
$app->get(
    '/chapters',
    function () use ($app) {
        executeSql($app, 'SELECT * FROM chapters ORDER BY id');
    }
);

//GENERIC SQL EXECUTE
function executeSql(\Slim\Slim $app, $sql) {
        $app->contentType('application/json');
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $results = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($results);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}
$app = new \Slim\Slim();

// GET CHAPTERS
$app->get('/chapters', function () use ($app) {

  $app->contentType('application/json');

  $chapters = executeSql('SELECT * FROM chapters ORDER BY id');

  if ($chapters) {
    $app->response->setStatus(200);
    echo json_encode($results);
  } else {
    $app->response->setStatus(400);
    echo '{"error":{"text":"error getting chapters"}}';
  }

});

// GENERIC SQL EXECUTE
function executeSql($sql) {
  try {
    $db = getConnection();
    $stmt = $db->query($sql);  
    $results = $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;
    return $results;
  } catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
  }
}

解决这个问题的简单方法是使用getInstance()


将数据库调用和应用程序逻辑/表示分离会更干净。我会立即返回您的“chapters”对象,并处理executeSql函数之外的任何其他内容

$app = new \Slim\Slim();

//GET CHAPTERS
$app->get(
    '/chapters',
    function () use ($app) {
        executeSql($app, 'SELECT * FROM chapters ORDER BY id');
    }
);

//GENERIC SQL EXECUTE
function executeSql(\Slim\Slim $app, $sql) {
        $app->contentType('application/json');
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $results = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($results);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}
$app = new \Slim\Slim();

// GET CHAPTERS
$app->get('/chapters', function () use ($app) {

  $app->contentType('application/json');

  $chapters = executeSql('SELECT * FROM chapters ORDER BY id');

  if ($chapters) {
    $app->response->setStatus(200);
    echo json_encode($results);
  } else {
    $app->response->setStatus(400);
    echo '{"error":{"text":"error getting chapters"}}';
  }

});

// GENERIC SQL EXECUTE
function executeSql($sql) {
  try {
    $db = getConnection();
    $stmt = $db->query($sql);  
    $results = $stmt->fetchAll(PDO::FETCH_OBJ);
    $db = null;
    return $results;
  } catch(PDOException $e) {
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
  }
}

你得到一张空白页后有没有出现错误?还有其他方法吗?当前我正在将$app对象作为参数传递。我不知道这样做对不对为什么不?您唯一的其他选择是使用全局声明访问Slim对象。您通常不希望使用全局变量。将细长对象作为参数传递是一种称为的模式。DI是一个很好的实践,因为它将函数中的代码与其依赖的依赖项解耦。您好,感谢这段代码。但我是一个PHP新手,这里的任何人都可以验证这是正确的方法。是的,Slim developer专门创建了getInstance方法,以便在函数中使用$app