web-dev-qa-db-ja.com

phpはメソッド内からのクラス呼び出しを必要とします

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

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

例えば。

  function test() {

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

 }

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

12
Jeremy Gwa

やや意外なことに、これは問題なく機能しているようです。含まれているコードは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()します。

19
timdev

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

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

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

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

7
icio

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

1
Titan

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();
1
buley

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

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

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

0
waiwai933

ご覧のとおり、クラスの読み込みに外部ファイルを使用していますが、正しいですか? クラスの自動読み込み を使用してみませんか。さまざまな状況でさまざまなクラスのボディをロードしたい場合は機能しないことはわかっていますが、それが良い習慣かどうかは本当にわかりません。

0
user332282