メソッドの戻り値を書き込みコンテキストで使用できません


465

次のコードは機能すると思いますが、機能しません(編集:PHP 5.5以降で機能するようになりました)

if (!empty($r->getError()))

getError()単純にどこにある:

public function getError()
{
    return $this->error;
}

それでも私はこのエラーに終わります:

書き込みコンテキストでメソッドの戻り値を使用できません

これは何を意味するのでしょうか?これはただの読みではありませんか?


2
おそらくPHP 5.5で、あなたはに式を渡すことが許可されますemptywiki.php.net/rfc/empty_isset_exprs
カルロスCampderrós


さて、porneLの回答が 正しいこともわかります。このコード if ( !$e->find('div') ) は、現在のHTML DOM要素が空かどうかをチェックします。私はそれをループの内側で使用して、内側のDivを含まない単一のDivのみを出力します。
セーラム

回答:


769

empty() (その参照が存在するものを指しているかどうかを確認するために)参照によって値にアクセスする必要があり、5.5より前のPHPは関数から返される一時的な値への参照をサポートしていませんでした。

ただし、実際に発生する問題はempty()、「空」の値が「false」とは異なると誤って信じて使用することです。

空は単なるのエイリアスです!isset($thing) || !$thing。チェックしているものが常に存在する場合(PHPでは関数呼び出しの結果は常に存在します)、empty()関数は否定演算子にすぎません

PHPには空の概念はありません。falseと評価される値は空で、trueと評価される値は空ではありません。それは同じことです。このコード:

$x = something();
if (empty($x)) 

この:

$x = something();
if (!$x) 

常に同じ結果、全ての場合に、すべてのデータ型のための(ため$xに定義されるempty()冗長です)。

メソッドからの戻り値は常に存在します(returnステートメントがない場合でも、戻り値は存在し、を含みますnull)。したがって:

if (!empty($r->getError()))

論理的には次と同等です:

if ($r->getError())

29
これは現在選択されているものよりもはるかに良い答えです。
SystemParadox 2011

20
@gcb:いいえ、PHPマニュアルでは、明示的にそれは同じだと言う:「の反対がある)(空の(boolean) var変数が設定されていない場合に警告が生成されないことを除いて、。」
Kornel、2011年

16
警告部分を生成しないことは非常に重要です... empty($ var)は、0、 ''、array()、NULL、または定義されていない場合でもtrueを返します。特に、ファイルがいっぱいになることなく実際の警告をログに記録できるようにすることをお勧めします
Landons

3
わかりました、いい答えですが、これを回避する正しい方法は何ですか、誰か知っていますか?
Javatar、2013年

3
一般的には@EugenMihailescu大丈夫だこと、それがあるため、厳密に()空に同等ではありません""0ヌルなど「空」ですが、ありません。
Kornel 2014

330

注:これは非常に投票数の多い回答で、視認性が高くなりますが、不適切で不要なコーディング手法を促進することに注意してください。正しい方法については、@ Kornelの回答を参照してください。

注2:@Kornelの回答を使用する提案を支持します。3年前にこの回答を書いたとき、私は単にエラーの性質を説明するためのものであり、必ずしも代替案を支持するものではありませんでした。以下のコードスニペットは推奨されません。


これは、5.5より前のバージョンのPHPではempty()の制限です。

注:empty()は変数のみをチェックします。それ以外の場合は解析エラーが発生するためです。つまり、次は機能しません:empty(trim($ name))。

これに変更する必要があります

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

156
これはめちゃくちゃ逆効果です。
デビッドマードック

47
注:同じことがにも当てはまりますisset()。つまりisset($this->foo->getBar())、同じ問題が発生します。
catchdave

7
porneLの回答はこれをより詳細に説明し、より良い解決策を示しています
SystemParadox

5
@SystemParadox-「より良い」という意味に依存します。porneLの答えは、間違いなく「よりクリーンな」ソリューションでより完全ですが、実際にエラーの原因も説明していません。
Peter Bailey

4
間違いではないので、@ deceze。それは最良の答えではありません、あなたは私から何の議論も得ません。私もポルノエルに投票しました。それは非常に古い答えですが、それは間違いではありませ。高い投票について:覚えておいてください、porneLはこの投票からほぼ17か月後に到着しました。
Peter Bailey、

37

PHPのドキュメントによると:

empty()は変数のみをチェックします。それ以外の場合は解析エラーが発生するためです。

empty()関数の戻り値を直接使用することはできません。代わりに、return from getError()を変数に設定し、変数で実行empty()します。


19

私は通常、この問題を回避するためだけにis_empty()というグローバル関数を作成します

function is_empty($var)
{ 
 return empty($var);
}

次に、通常empty()を使用していた場所ならどこでもis_empty()を使用します


2
これを行わずに標準に固執することをお勧めします(それらがそうであるかもしれないので)。
tonyhb

1
@ダイナミズムあなたはなぜそうではないのか説明できますか?
Janis Veinbergs、2011

1
なぜなら、便利な関数は他の誰かのコードを読むのが面倒だからです。さらに、MVC / HMVCアーキテクチャでは、構造が混乱する可能性があります。結局のところ、PHPプログラマーは、その制限を理解し、便利な関数を使用せずに小さな回避策を理解できる必要があります。
tonyhb 2011

14
うわー、あなたは否定関数を発明しました。PHPは!このための演算子を知っていますか?:)
Kornel

4

他の人が指摘したように、これはempty()の(奇妙な)制限です。

ほとんどの場合、これを実行することはemptyを呼び出すことと同じですが、これは機能します。

if ($r->getError() != '')

5
これは真実ではありません- empty()単なる空の文字列よりも多くの可能性をカバーします
ロビーアベリル2015

3
だから、「ほとんどの目的で」と書かれているわけではありません。すべて
Jani Hartikainen 2015

2

問題はこれです。エラーが空でないかどうかを知りたいです。

public function getError() {
    return $this->error;
}

isErrorSet()メソッドを追加すると、問題が解決します。

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

これで、このコードは予告なく正常に動作します。

if (!($x->isErrorSet())) {
    echo $x->getError();
}

-3

配列が空かどうかを確認する別の方法は次のとおりです。

count($array)>0

それはそのエラーなしで私のために働きます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.