12

私の理解では、require は呼び出し元の php ファイルにコードを貼り付けます。

メソッド内から必要な場合はどうなりますか...コード/クラス全体をメソッド内に貼り付け、メソッド内の次のステートメントをブロックします。

例えば。

  function test() {

    require 'pathtosomeclasscode';
    somestatement; // any code after the require is blocked.

 }

正確な場所に貼り付けることなく、どこにでもコードを要求できるようにするにはどうすればよいですか?

4

6 に答える 6

21

少し驚くべきことに、これは問題なく動作するようです。含まれているコードは Baz::bork() のスコープ内で実行されますが、コードは単純にクラスを定義しており、クラスはグローバルです。したがって、定義されたクラスになります。

ファイル: Foo.php:

<?PHP
class Foo{
      function bar(){
               echo "Hello from Foo::bar()!\n";
      }
}

ファイル: Baz.php:

<?PHP
class Baz{

      function bork(){
               require_once "Foo.php";
               $f = new Foo();
           $f->bar();
      }
}

echo "testing internal definition:\n";
$b = new Baz();
$b->bork();

echo "\ntesting in global scope:\n";

$f = new Foo();
$f->bar();
echo "\nall done\n";

出力:

$ php Baz.php
testing internal definition:
Hello from Foo::bar()!

testing in global scope:
Hello from Foo::bar()!

all done

さて、このようにやりたいと思う場所はあまり思いつきません。人々は通常、クラス定義の外にあるクラスファイルの先頭で、可能な依存関係を require_once() します。

于 2010-05-03T00:58:04.347 に答える
7

require、、またはを呼び出してもrequire_once含まれているスクリプトに問題がない限り、関数内のコードの実行は停止しません。インクルードされたファイル内のコードは、関数と同じスコープで実行され(定義された関数とクラスはグローバルです)、そこに挿入されるのではなく、他にあるものを置き換えます。includeinclude_once

他の回答ではrequire、解決策として代替手段の 1 つを使用することをお勧めします。これらの解決策は、スクリプトのエラーが名前付けの競合 (つまり、クラスまたは関数の再定義の試み) に関係している場合に役立つ場合があります。発生した (または発生しなかった) ことの詳細を提供し、問題があると思わせて、本当の原因を解決できるようにします。

なお、これらのファイル インクルード メソッドは、コードをスクリプトに貼り付けません。貼り付けは、人々がテキストを維持するために使用するツールです。PHP マニュアルを読んで、これらの関数がどのように機能するかを理解することをお勧めします。

それらを調べた後、彼らの働きについてさらに質問がある場合は、もう一度投稿してください.

于 2010-05-03T00:50:17.783 に答える
1

require_once を試しますか? 他の場所に含める場合に備えてください。

于 2010-05-02T23:53:56.983 に答える
1

include_once('script.php') を使用すると、クラスの再宣言に関するエラーが発生しなくなります。

私は次のことを自分で試したことはありませんが、 include_once() を冗長に使用したくない場合は、このセットアップも機能する可能性があると考えています。

class Whatever {

    protected $classObject;
    public function __construct( /*...*/ ) {
        include('anotherClass.php');
        $this->classObject = new anotherClass();
    }

    public function someFunction( /*...*/ ) {
        $this->classObject->classObjectFunction();
    }

    public function anotherFunction( /*...*/ ) {
        $this->classObject->classObjectFunction();
    }
}

次に、同じ共有クラス オブジェクト内の関数をそれぞれ呼び出す次のコードを呼び出すことができます。

$Whatever = new Whatever();
$Whatever->someFunction();
$Whatever->anotherFunction();
于 2010-05-03T00:04:53.067 に答える
0

あなたが言っているのは、コードをすぐに実行したくないということだと思います。それが正しければ、いくつかのオプションがあります。

  1. 必要なものを移動できます。

  2. fopen() を使用してファイルを読み取り、解析することもできます。(eval は HTML を理解しないので呼び出せませんが、パーサーを使えばできます)

于 2010-05-03T00:59:03.203 に答える
0

ご覧のとおり、クラスをロードするために外部ファイルを使用していますが、正しいですか? Autoloading Classesを使用しないのはなぜですか。さまざまな状況でさまざまなクラス本体をロードしたい場合に機能しないことはわかっていますが、それが良い習慣であるかどうかは本当にわかりません。

于 2010-05-04T14:44:55.447 に答える