3

簡単な質問ですが、私は小さな MVC フレームワークに取り組んでいて、何かに気づきました。

例えば:

--PHPファイル--

class loadFiles{
        function __construct($file = NULL){
        include $file . '.php';
        }
}
$loadfiles = new $loadFiles('crucialsettings');
echo $randomstring; //Throws an error

--crucialsettings.php--

<?php
    $randomstring = 'hello';
?>

オブジェクト スコープ内に含まれるファイルは、グローバル スコープからはアクセスできないことに気付きました。グローバルにアクセスできるようにオブジェクト内にファイルを含める最良の方法は何ですか?

私はできるようになりたいです:

$loadfiles->settings();
$loadfiles->classes();
$loadfiles->passwords();

グローバル ファイル インクルードを処理するクラスを構築したいと考えています。

4

2 に答える 2

2

PHP のどこからコードをインクルードまたは要求するかは問題ではありません。インタープリターは、最初の定義パスではかなり直線的です。つまり、基本的に、含まれている/必要なすべてのファイルを、読み取られた正確な順序で 1 つの大きなファイルに圧縮します。

これについて注意すべきことの 1 つは、スコープが変更されることです。ただし、すべてが「グローバル」スコープに適用されます。「global」キーワードを使用して、変数を使用する前に変数を宣言することで、グローバル スコープから現在のスコープにいつでも何かをインポートできます。したがって、別のスクリプトから「グローバル」変数を使用したい場合は、それを要求するだけです。

少し例を...

a.php

include('b.php');
global $myVar;
echo $myVar;

b.php

include('c.php');

c.php

$myVar = 'Hello World';

インタープリターがこのコードを最初のパスの後に見るもの

// In global scope
$myVar = 'Hello World'

// In a.php scope
global $myVar;
echo $myVar;

つまり、phpファイルから次の行を追加するだけです

global $randomstring;

criticalsettings.php ファイルをインクルードすると、echo が機能します。

于 2012-12-31T03:32:20.700 に答える
1

ここでのフレームワークは、内部の非OOPに依存しすぎているようです。構築するための好ましい方法ではありませんが、変数のリストを循環し、それらをクラス/インスタンススコープの一部にすることで、必要なことを実行できます。ここでかなり役立つ関数はget_defined_vars()です。

ファイルa.php、b.php、c.phpがあるとしましょう。それぞれは次のようになります。

a.php<?php $a = "AAAAAA";

b.php<?php $b = "BBBBBBBBBB";

c.php<?php $c = "CCCCCCCCCCCCCCCCCCCCCCCCCCC";

class mystuff {
    function include_with_vars( $____file ) {

        // grab snapshot of variables, exclude knowns
        $____before = get_defined_vars();
        unset( $____before['____file'] );

        // include file which presumably will add vars
        include( $____file );

        // grab snapshot of variables, exclude knowns again
        $____after = get_defined_vars();
        unset( $____after['____file'] );
        unset( $____after['____before'] );

        // generate a list of variables that appear to be new
        $____diff = array_diff( $____after, $____before );

        // put all local vars in instance scope
        foreach( $____diff as $variable_name => $variable_value ) {
            $this->$variable_name = $variable_value;
        }
    }

    function __construct($file = NULL){
        $this->include_with_vars( "a.php" );
        $this->include_with_vars( "b.php" );
        $this->include_with_vars( "c.php" );
    }
}

$t = new mystuff();
echo "<PRE>"; 
print_r( $t );

このプログラムは、include()ディレクティブからローカル変数を取得し、それらをクラススコープに配置します。

mystuff Object
(
    [a] => AAAAAA
    [b] => BBBBBBBBBB
    [c] => CCCCCCCCCCCCCCCCCCCCCCCCCCC
)

つまり、ファイルa.php($a)のローカル変数はになり$t->aました。

于 2012-12-31T05:21:46.977 に答える