2009-07-22 13 views
9

誰かがrequire_once()またはdie()をなぜ知っていますか?動かない。私はdie()にキー入力するエラーメッセージの代わりに、常に致命的なエラーが表示されます。私のコードは、以下を参照してください:require_once()またはdie()が動作しない

require_once ('abc.php') or die("oops"); 

エラーメッセージの表示などでの代わりに、メッセージの

"Fatal error: controller::require_once() [function.require]: Failed opening required '1' (include_path='....."

"おっと")Iキー以下

答えて

28

またはが高いです。 require/require_onceより優先されます。したがって、phpは結果をrequire_onceに渡す前に

('abc.php') or die("oops") 

を評価する前に評価します。 またはは2つのブール型オペランドをとります。 ( 'abc.php')に評価したがって、式全体は、

require_once true; 

で呼び出されます。 require_onceは文字列を取る、ブール(真) - >文字列= > 1 = >

Failed opening required ' 1'
あなたはそこに死ぬ(...)必要はありません。ファイルを読み込めない場合、require_onceはとにかくphpインスタンスを停止します。実際に

Because include() is a special language construct, parentheses are not needed around its argument. Take care when comparing return value.

それだけで一つのパラメータを持っており、追加のかっこでラップすることはない:includeとして

+4

鮮やかな答え。 require_onceは関数ではないことを強調する必要があります。これは単項演算子(または、あなたが好きな場合は言語構造体)なので、echo、new、includeなどです。 –

+0

ありがとう!しかし、die()を一見許容できる形で追加することによって、ファイルを見つけられない、あるいは必要とするようなエラーがスローされます。 - または - インクルードファイルにエラーがあります。 'require()やdie()'のコードが悪いです。 – aequalsb

12

は、それがparemeterリストのparanthesisを必要としない、特殊な関数ではなく言語構造の何かを変更:

1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡ …

だからあなたの文は(paremterがちょうどラップされている)、これに同じです:

require_once (('abc.php') or die("oops")); 

またはのいずれかのパラメータとしてブール式を使用しています。そして、値はそれぞれ"1"""の文字列に相当持っていること:

var_dump((string) true === "1"); 
var_dump((string) false === ""); 

なぜこの失敗した開口部が必要な取得「1」エラーメッセージ理由です。

しかし、これはあなたがそれを望むようにそれが仕事になるように適切な場所に括弧を使用して:

(@include_once 'abc.php') or die("oops"); 

ここ'abc.php'がはっきりパラメータであり、die("oops")との論理和がinclude_onceの戻り値で実行されます。 @ operatorは、ファイルが存在しない場合に発生するエラーメッセージinclud_onceを無視するだけです。

PS:printも特殊な言語構造であり、同じように動作します。

4

評価する場合:

require_once ('abc.php') or die("oops"); 

をPHPが何らかの理由で最初に評価し 'OR死ぬ( "おっと")'。 PHPがrequire_once( 'abc.php')を評価するようにするには、大括弧で囲みます。

(require_once ('abc.php')) OR die("oops"); 

しかし、「require」が失敗した場合、PHPは処理を停止しますので、代わりに「include」を使用してください(https://stackoverflow.com/a/2418514/1704651を参照)。また、include_onceの前の@記号はMySQLからのエラーメッセージを抑制し、 "oops"だけが出力されます。

(@include_once ('abc.php')) OR die("oops"); 

期待どおりに動作します。

出典:自分自身の欲求不満とhttps://bugs.php.net/bug.php?id=22342

+0

が含まれているか死んでいます。ファイルが欠けている理由を明確にする必要がある場合に役立ちます(たとえば、定義する必要のある設定ファイルなど) – jocull

+0

@をインクルードするのはおそらく悪い考えです。 @includeは、インクルードされたファイルとそのファイルに含まれるすべてのファイルのすべてのエラーを抑制し、トラブルシューティングとエラー処理を悪夢にします。 –

関連する問題