2016-08-25 8 views
-3

自分自身の練習とトレーニングのために自分でCMSを構築しています。この演習の一部はカスタムhtml、CSSテンプレートを有効にすることですrequire_once関数内

データベースハンドラなどの外部変数を保護する関数内にrequire_onceを含むPHPテンプレートファイルを開いた方が良いでしょうか?

これとはまったく違うのですか?

それは require_once()関数内の変数を定義して、外部ファイルに全く役に立たないだろう
+0

'require_once'が関数にどのように関係しているのか分かりません。 –

+0

require_onceを関数内で使用すると、この関数で定義されている変数だけが動作することがわかります –

+0

これは 'require_once'に固有のものではありません。これはVariablesスコープと関係があり、 'require_once'に束縛されていません。 http://php.net/variables.scope –

答えて

0

library.php:

<?php 

if (!isset($counter)) { 
    $counter = 0; 
} 

$counter++; // increments every time this file is included 
echo "Counter is $counter\n"; 

maincode.php:

<?php 

function foo() { 
     require_once('library.php'); 
     echo "foo() has counter = $counter\n"; 
} 

function bar() { 
     require_once('library.php'); 
     echo "bar() has counter = $counter\n"; 
} 

foo(); 
bar(); 

結果:

$ php maincode.php 
Counter is 1 
foo() has counter = 1 
PHP Notice: Undefined variable: counter in maincode.php on line 10 
bar() has counter = 

Include d/require dファイルは、実行されているコンテキストのスコープを継承します。includeを関数で実行すると、関数のコンテキストが取得され、関数内の変数がローカル変数になり、破棄されます関数呼び出しが返ったとき。

_once()の亜種を実行した場合、スクリプトの全ライフタイムでファイルは文字通りONCEになり、上記の警告につながります。 require_once()bar()のコールは、ファイルがすでにfoo()コールの中に以前含まれていたため、何もしませんでした。したがって、それは含まれていません。$counterbar()に決して定義されず、今は何も動作しません。

もちろん、普通のinclude()require()の亜種を使用することもできます。しかし、同じ問題が残っています - 関数が終了すると、インクルードされたファイル内で定義された変数はすべて破棄されます。つまり、データベース接続のようなものも破壊され、クリーンアップされます。つまり、関数呼び出し間でトランザクションを開いておくことは不可能です。

+0

を参照してください。これを知ったら、私はもっとスマートに感じます。 関数内にインクルードされたファイルを格納するという私の目標はうまくいきます。あなたが言及したように、この方法でそれを行うには、その反対に悪い。回答ありがとうございます –