下面的代码块实际上在整个脚本运行时执行。我不清楚的是方法write
只测试if data is not written to file
的情况。那么应该抛出异常。它确实说if $data exist and writeable
然后写入它。
public function write($data) {
if (@!fwrite($this->_fp, $data . "\n")) {
throw new Exception('Could not write to the file.');
}
}
以前是这样的:
if( condition is true ) {
echo 'Run Code';
} else {
echo 'Throw Exception';
}
或类似的东西
public function query($sql) {
$result = mysql_query($sql, $this->connection);
if(!$result){
die("Database Query Failed : ". mysql_error());
}
return $result;
}
这怎么可能?
答案 0 :(得分:2)
如here中所述if(expr)evaluates
expr
为其布尔值..这意味着在您的示例中调用write
函数时,{ {1}}函数始终执行,然后fwrite
检查它是否返回虚假或真值。
并且从doc if
因此fwrite() returns the number of bytes written, or FALSE on error.
在错误时评估为true,并抛出异常
答案 1 :(得分:1)
我不擅长解释这类事情,但让我们试试:)
我认为你误解了条件是如何运作的。
让我们使用一个简单的例子
if($x == 1) {
echo 'Run Code';
} else {
echo 'Throw Exception';
}
if
和你放在里面的是独立的。条件只是一个返回布尔值的语句,而if
只是测试一个布尔值(无论返回它)。所以你可以像这样改变这个例子:
$is_x_equal_to_one = ($x == 1); // $is_x_equal_to_one now contains true or false
if($is_x_equal_to_one) {
echo 'Run Code';
} else {
echo 'Throw Exception';
}
!
运算符否定表达式。如果是真的,它将返回false,如果为false,则返回true。
所以你可以像这样恢复你的状况:
$is_x_equal_to_one = ($x == 1);
if(!$is_x_equal_to_one) {
echo 'Throw Exception';
} else {
echo 'Run Code';
}
现在如果你不需要运行任何代码,如果$x
不等于1
,你只想说“某些内容已被破坏”,该怎么办? else语句总是可选的:
$is_x_equal_to_one = ($x == 1);
if(!$is_x_equal_to_one) {
echo 'Throw Exception';
}
fwrite
不仅写入文件,如果它不起作用,它也会返回false
。如果有效,则返回正整数。使用PHP将正整数计算为true
。
这意味着您可以像这样使用它:
$is_write_successful = fwrite($this->_fp, $data . "\n");
if(!$is_write_successful) {
echo 'Throw Exception';
}
最后,您可以通过删除无用的临时变量来缩短此代码:
if(!fwrite($this->_fp, $data . "\n")) {
echo 'Throw Exception';
}
答案 2 :(得分:0)
您可以重写if
:
$returnValue = @fwrite($this->_fp, $data . "\n");
if (!$returnValue) {
因此它将始终执行fwrite
函数。