今天发现个函数 assert 和 assert_options, 他们组合可以完成一个简单的phpunit的功能, 但是实在是太简单, 所以用处不太大, 但是还是记录一下好了.
主要问题是不能灵活的自己定义错误的提示信息,只能提示出问题的文件和行数.
具体的使用方法可以看 <> 或者 <>
同时可以结合 <>中 "XXVII. Error Handling and Logging Functions" 章节里的东西,共同使用.
下面是我写的一个测试文件, 包含了所有的功能的测试,不过ASSERT_QUIET_EVAL一直不太明白,没测试出来具体有什么样作用
function assert_failed($file, $line, $expr) {
print "Assertion failed in $file [ $line ] : $expr
";
}
//error_reporting设置为0, 相当于调用assert_options(ASSERT_WARNING, 0);
//error_reporting(0);
//是否启用对ASSERT_ACTIVE的支持
assert_options(ASSERT_ACTIVE, 1);
//是否在发送第一次wanning的时候,停止脚本的执行
assert_options(ASSERT_BAIL, 0);
//没搞定,还不明白具体怎么用,偶测试不出来
//assert_options(ASSERT_QUIET_EVAL, 0);
echo "step 1
";
assert(1==1);
echo "step 2
";
assert(2==1);
echo "step 3
";
//设定assert的callback样式,可以自己定义wanning信息显示时的样式
assert_options(ASSERT_CALLBACK, 'assert_failed');
//不显示assert()自己产生warnning信息,如果设置了ASSERT_CALLBACK,仍然还会显示ASSERT_CALLBACK函数对应的信息,但是函数中传入的$expr参数不起作用.
//assert_options(ASSERT_WARNING, 1);
assert(1==1);
assert((1/0)>2);
echo "step 4
";
?>
下面的一段话是直接从 中copy出来的
The assert( ) function is a clever one that works along the same lines as our print statements, but it only works if a certain condition is not matched. Essentially, assert( ) is used to say "This statement must be trueif it isn't, please tell me." For example:
print "Stage 1\n";
assert(1 = = 1);
print "Stage 2\n";
assert(1 = = 2);
print "Stage 3\n";
Here we have two assert( )s, with the first call asserting that one must be equal to one, and the second call asserting that one must be equal to two. As it is impossible to redefine constants like 1 and 2, the first assert( ) will always evaluate to true, and the second will always evaluate to false. Here is the output from the script:
Stage 1
Stage 2
Warning: assert( ) [http://www.php.net/function.assert]: Assertion failed
in /home/paul/sandbox/php/assert.php on line 5
Stage 3
最初のassert( ) はTRUeと評価されたため出力にはまったく表示されませんが、2番目のassert( ) はfalseと評価されたため、アサーションの失敗に関する警告が表示されます。ただし、スクリプトの実行は続行されるため、アサーション失敗の警告の後に「ステージ 3」が表示されます。アサーションが true と評価される限り、スクリプトの実行には影響しません。つまり、デバッグ目的でアサーションを挿入でき、デバッグ終了後にアサーションを取り出すことを心配する必要はありません。
アサーションによる実行速度の低下が心配な場合は、速度低下は最小限に抑えられますが、依然として妥当な懸念であるため、assert_options( ) 関数を使用するか、assert を設定することで、assert( ) の実行を無効にすることができます。 php.ini ファイルでアクティブをオフにします。 assert_options( ) を使用する場合は、設定するオプションとそれに設定する値の 2 つのパラメータを必要とします。
表 22-1 は、assert_options( ) の最初のパラメータに使用できるオプションのリストを示しています。 assert_options( ) の最初のパラメータ
パラメータ デフォルト 説明
ASSERT_ACTIVE On assert( ) 呼び出しの評価を有効にします
ASSERT_WARNING On 失敗したアサーションごとに PHP 出力に警告を出力します
ASSERT_BAIL オフ 失敗したアサーションで PHP にスクリプトの実行を強制終了します
ASSERT_QUIET_EVAL オフ Assert( ) 呼び出しのエラーを無視します
ASSERT_CALLBACK オフ 失敗したアサーションで呼び出すユーザー関数を指定します
assert_options(ASSERT_ACTIVE, 0);
assert_options(ASSERT_BAIL, 1);
ASSERT_CALLBACK は、コードがアサーションに失敗した場合のエラー ハンドラーを作成できるため、便利なオプションです。アサーションが失敗したときに実行する関数の文字列名を受け取り、定義する関数は 3 つのパラメーターを取る必要があります。1 つはアサーションが発生したファイルを保持するパラメーター、1 つは行を保持するパラメーター、もう 1 つは式を保持するパラメーターです。コールバック関数で 3 つすべてを一緒に使用すると、デバッグできる意味のあるエラー メッセージを生成できます。例:
functionassert_failed($file, $line, $expr) {
print "$line の $file でアサーションが失敗しました: $exprn";
}
assert_options(ASSERT_CALLBACK, 'assert_failed');
assert_options(ASSERT_WARNING, 0);
$foo = 10;
$bar = 11;
assert($foo > $bar);
ASSERT_WARNING も無効になっており、PHP による警告の出力とコールバック関数の実行が停止されます。最後に、2 つの変数が設定され、assert() の呼び出しの一部として使用されます。ご覧のとおり、$foo は明らかに $bar より大きくありません。これは、アサーションが失敗し、コールバックを呼び出すことを意味します。したがって、スクリプトからの出力は次のようになります。 /home/paul/tmp/blerg.php の 9 行目でアサーションが失敗しました: $foo > $バー。
TRUe または false を返す限り、任意のステートメントを Assert( ) できます。これにより、assert() 関数は信じられないほど強力になります。アサーションの実行をオフにするだけでコードをフルスピードで実行できると考えると、さらに強力になります。
assert( ) 可能なものの例をさらにいくつか示します。
assert($ Savings >= $salary / 10);
assert($myarray = = array("apone", "burke", "hicks"));
assert(preg_match("/野生の羊を追いかける/", $book));