0

次の例を考えてみてください。

テンプレート.php:

<?php

echo $vars['arr'];

echo " -------- ";

echo $vars['obj'];

?>

test.php:

<?php
$file = "template.php";
$vars = array( 'arr' => array(), 'obj' => new StdClass() );  

var_dump( json_encode($vars)  );  

function loadFile($file, $vars)
{
    try 
    {
        if (is_array($vars) && !empty($vars)) {
            extract($vars);
        }

        ob_start();
        include $file;
        return ob_get_clean();
    } 
    catch (Exception $e) 
    {
        return false;
    }
}

loadFile($file, $vars);

?>

このコードは次を出力します。

string(19) "{"arr":[],"obj":{}}"
PHP Catchable fatal error:  Object of class stdClass could not be converted to string in template.php

ここでの問題は、template.php で $vars を array() と考えていますが、json 出力からわかるように、要素の 1 つはオブジェクトです。

テンプレートに単純なチェックを追加して、ekement が配列であるかどうかを確認すると問題は解決しますが、これを複数の要素、要素に対して行う必要があるため、あまり良くありません =) ため、方法を見つけようとしています。テンプレートと $vars をバインドする瞬間のエラーを防ぎます。

ありがとうございました

4

4 に答える 4

2

解析中に error_reporting をオフにするだけです。

$old_level = error_reporting(0); // no errors, preserve old error reporting level
ob_start();
include $file;
$content = ob_get_clean();
error_reporting($old_level); // reset error reporting level
return $content;

注:これにより、それほど重大ではないエラーのみが非表示になります。

Catchable Fatal Errorをキャッチするには、次の質問を参照してください: How can I catch a "catchable fatal error" on PHP type Hinting?

set_error_handlerを使用してエラー ハンドラを登録する必要があります。

function handleError($errno, $errstr, $errfile, $errline) {
  // handle error

  // return true, so the normal php handler doesn't get called
  return true;
}
set_error_handler('handleError');

error_handlers も設定する他のコードにハンドラーをきれいに統合したい場合は、後でrestore_error_handlerを使用してエラーハンドラーを復元することを検討してください。

于 2013-02-14T14:03:28.250 に答える
0

クラスで __toString() メソッドを使用して、エラーを回避できます。__toString() メソッドに必要な任意の値を設定できます。おそらく配列を返します。 http://www.php.net/manual/en/language.oop5.magic.php#object.tostring

別のオプションは、 array_walk を使用することです:

function checkObj(&$vars){ 
if (is_object($vars)) {
    $vars = get_object_vars($vars);
}
} 
array_walk($vars, "checkObj"); 
于 2013-02-14T20:18:16.457 に答える
0

最初に値がオブジェクトかどうかを確認してから、PHP 関数を使用して配列に変換してみてください。

コードのこのセクションに注意してください。

if (is_array($vars) && !empty($vars)) {
    extract($vars);
}

その後、私があなたのコードを正しく読んでいれば、おそらく $vars という名前の変数があり、それがオブジェクトである可能性があります。したがって、これを行うことができます:

if (is_object($vars)) {
    $vars = get_object_vars($vars);
}

それはあなたが必要とするものにそれを変換するはずです。もちろん、シナリオに適合するかどうかを確認するために、少し実験する必要があるかもしれません。ありがとう!

于 2013-02-14T14:31:42.433 に答える