0

同じクラスのメソッド内の他のインクルードファイルでクラスプロパティを使用できるようにするにはどうすればよいですか?

// file A.php
class A
{
    private $var = 1;

    public function go()
    {
        include('another.php');
    }
}

別のファイル:

// this is another.php file
// how can I access class A->var?
echo $var; // this can't be right

スコープを考えると、これは可能ですか。varが配列の場合はextractを使用できますが、varが配列でない場合は配列でラップできます。もっと良い方法はありますか?

ありがとう!

編集

わかりました。another.phpを明確にすることは文字通り別のファイルです。基本的に、上記の例では、クラスAを含む2つのファイルA.phpと、何かを実行する別のファイル/スクリプトであるanother.phpがあります。

回答:私の悪い...index.phpからanother.phpを含めました..スコーピングがまだ適用されているようです..みんなに感謝します..

4

3 に答える 3

1

あなたの質問、「メソッド内からインクルードされたファイル内にある場合、プライベートインスタンスメンバーにアクセスするにはどうすればよいですか?」のようです。

コード例では、メソッド内にファイルを含めています。

メソッドは単なる関数です。PHP の他のすべての領域と同様に、インクルードされるファイルは現在のスコープ全体を継承します。つまり、インクルードはそのメソッドのスコープ内のすべてを認識します。含む$this

つまり、関数自体の内部からアクセスするのと同じように、インクルード ファイルのプロパティにアクセスします$this->var


PHP インタラクティブ シェルを使用した例:

[charles@lobotomy /tmp]$ cat test.php
<?php
echo $this->var, "\n";

[charles@lobotomy /tmp]$ php -a
Interactive shell

php > class Test2 { private $var; public function __construct($x) { $this->var = $x; } public function go() { include './test.php'; } }
php > $t = new Test2('Hello, world!');
php > $t->go();
Hello, world!
php > exit
[charles@lobotomy /tmp]$ php --version
PHP 5.4.4 (cli) (built: Jun 14 2012 18:31:18)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans
于 2012-12-08T05:16:39.433 に答える
0

$varプライベートとして定義しました。これは、メンバー関数からの$varアクセスできることを意味します。アクセスする必要がある場合は、公開するか、メンバー関数から返します。PHPマニュアルから可視性についてもっと読む必要があります$var

編集:あなたの状況を面白くしているincludeのは、メンバー関数から呼び出しているということです。 include呼び出されたスコープを継承します。$this->varしたがって、技術的には、から呼び出すことができますanother.php。ただし、私はこの慣行に反対することを強くお勧めします。他の場所に含まれているanother.phpと、エラーが発生します。どうか、これをしないでください。それはひどいプログラミングの練習です。

本当に必要な場合は、次の行を追加してくださいA.php

$obj = new A();
$obj->go();    // this will call another.php, which will echo "$this->var"

そして、another.phpこれに変更します。

echo $this->var;

そしてそれは機能します。正しい出力が得られます。クラスAのインスタンスを宣言しない場合、これは失敗することに注意してください(たとえば、、、A::go()などA->go()はすべて失敗します)。これは、PHPで物事を進めるための非常にひどい方法です。

しかし、より良い方法で物事を行うと、変数を公開することができます。

class A {
    public $var = 1;  //note, it is public!
    public function go() {
        include('another.php');
    }
}
$obj = new A();
echo $obj->var; //woot!

または、プライベートにしてください(これはOOPの方が優れています):

class A {
    private $var = 1;  //note, it is private

    //make a public function that returns var:
    public function getVar() {
        return $this->var;
    }

    public function go() {
        include('another.php');
    }
}

$obj = new A();
echo $obj->getVar(); //woot!
于 2012-12-08T05:10:15.750 に答える
-2
 class A
{
    public $var = 1;

    public function go()
    {
        include('another.php');
    }
}

$objA = new A();

$objA->go();
于 2012-12-08T05:15:19.700 に答える