4

オブジェクトの操作方法が理解できません。

特定のコード:

class first{
    class second{
        public function widgets(){
            $a_variable = $a_value;
        }
        #1
    }
    $second = new second;
    #2
}
#3
$first = new first;
  1. 関数内でのみ使用できるため、初期化$a_variableすると正しいですか?$a_variable
  2. クラス second 内でのみ使用できるように初期化$a_varialbeすると、正しいですか?$this->a_variable
  3. $a_variableとして初期化できます$first->second->a_variableか? #1もしそうなら、 、#2、でどのように呼び#3ますか?
  4. 初期化できます$a_varialbe as $this->second->a_variableか?#1もしそうなら、 、#2、でどのように呼び#3ますか?

ご覧のとおり、OOP がどのように機能するかについて、私は単純に混乱しています。


まず第一に、私はすべての助けにどれほど感謝しているかを表現したいと思います. 私はすでに、この質問が大成功であると考えるのに十分すぎるほど多くのことを学んできました.

とはいえ、形式が不十分で、疑似コードで、構文が無効であっても、このコードは実行されます。

class class_1{

    public function function_1(){

        require('class_2.php');

        public function function_2_callback(){

            //%%%%%%  How do I set a variable here and get the DATA...

        }

        $this->class_2 = new class_2("function_2_callback");
    }

}

$class_1 = new class_1;

//&&&&&&&&&& Get the DATA here?



/* CONTENTS OF class_2.php */

class class_2($callback){

    call_user_function($callback);

}

これを演習として見なければならない場合でも. 示されているように、最初に (@ %%%%%%%) を設定してから変数 (@ &&&&&&&&) を呼び出す方法を教えてもらえますか?

4

4 に答える 4

2

そのようなクラスをネストするべきではありません。それも実行されるべきではありません。最初にコードを実行することをお勧めします。このようなPHPコードの小さなスニペットをテストするためのツールがオンラインにいくつかあります。

期待どおりにコードを実行するには、次のようになります。

class second{
    public function widgets(){
        $a_variable = $a_value;
    }
}

class first{
    public $second;

    public function __construct() {
        $this->second = new second;
    }
}

$first = new first;

$ [az] +で始まる変数は、関数に対してローカルです。$ this-> [az] +([az]は1文字以上)で始まるプロパティは、オブジェクトの一部です。

php.netには、phpのオブジェクトの詳細を説明するドキュメントがいくつかあります

$a_variableを$a_variableとして初期化すると、関数内でのみ使用できますよね?

はい正解。$[az]で始まります。globalキーワードを使用する場合は完全には当てはまりませんが、それはお勧めできません。

$a_varialbeを$this->a_variableとして初期化した場合、それはクラス2番目の内部でのみ使用可能です。

はい。ただし、最初に宣言する必要があります。public $variableこれは、、protected $variableまたはで実行できますprivate $variablepublicプロパティは外部からアクセスできることを意味しますがprivate、クラス自体のみがアクセスできることを意味します。protected外部にはプライベートですが、クラスから拡張するクラスにはパブリックです。

public/ private/ publicPHP 5で利用可能になりました。PHP4では、を使用します。これは、var $variablePHP 5ではデフォルトでpublicになります)

$a_variableを$first->second-> a_variableとして初期化できますか?

クラス変数を宣言せずに任意に初期化することができますが、それはあなたがすべきことではありません。

もしそうなら、私はそれを#1、#2、および#3でどのように呼びますか?

そこでコードを呼び出すことはできません(あなたの例では)。コードは、関数内またはグローバルコンテキスト内(クラス定義外)にある必要があります。

于 2012-11-20T07:57:41.903 に答える
2

まず、あなたの例は無効なコードです PHP はネストされたクラスをサポートしていません。つまり、クラス内のクラスです。

クラスを定義する場合、メソッド内で初期化された変数はそのメソッドに対してローカルであり、$this->newattribute を使用して属性を「初期化」できますが、(メソッド public / を記述する前に) それとその可視性を宣言する必要があります。 private / protected $varname = "初期値";)。

質問 3 と 4 は、別のコンテキストでは意味があります。これは、オブジェクトが別のオブジェクトのメンバーとして渡される場合です。以下の例を参照してください。

のようにビルドすると

<?php

class First {  
  public $second;
}

class Second {
  public $a_variable;
}

$foo = new First();
$foo->second = new Second();

アクセスできます:

$foo->second->a_variable = "foo";

またはメソッド内で秒単位で

$this->a_variable;

またはメソッド内で最初に

$this->second->a_variable;
于 2012-11-20T08:20:05.557 に答える
2

最初に:あなたが持っているものは機能しません.あなたがやっているようにクラス内でクラスを宣言することはできません.

PHP (OOP を含む) のスコープは非常に単純です。

  1. 変数には関数スコープがあります
  2. オブジェクトへの参照がある場合、オブジェクトのプロパティにアクセスできます
  3. オブジェクト プロパティの可視性を制限できます

あなたが持っている唯一の実際のスコープは、変数の関数スコープです:

$a = 'foo';

function bar() {
    $a = 'bar';
}

2 つ$aの はまったく無関係であり、スコープが異なります。それと同じくらい簡単です。

class Foo {

    public $a = 'foo';

    public function bar() {
        $this->a;  // foo

        $a = 'bar';
    }

}

$foo = new Foo;
$foo->a;  // foo

オブジェクト プロパティにはスコープがなく、可視性があります。スコープ内にオブジェクトがあればアクセスできます。上$fooはオブジェクトです。スコープ内にあり、そのプロパティapublicであるため、 を使用してアクセスできます$foo->a。クラス内では、 を介してプロパティにアクセスできます$this->a

$a = 'bar'関数内のローカル変数であり、 とは何の関係もありません$this->a。関数内以外ではアクセスできません。ルール #1、関数のスコープを参照してください。

class Bar {

    protected $b = 'bar';

    public function baz() {
        $this->b;  // bar
    }

}

$bar = new Bar;
$bar->b;  // doesn't work

可視性が でない場合public、プロパティ (ここでbは ) はクラス自体の外部からアクセスできません。クラス内では を使用してアクセスできますが、 を使用$this->bして外部からアクセスすることはできません$bar->b。それはスコープではなく、可視性です。

これが PHP のスコープ規則です。

于 2012-11-20T08:22:32.953 に答える
2

クラスの簡単な説明

class foo{

    // This can be accessed anywhere
    public $i_am_public;

    // This can be accessed within this class and any sub classes
    protected $i_am_protected;

    // Thi can only be accessed within this class
    private $i_am_private;

    // This function can be accessed anywhere
    public function foo_function(){

        // This variable is only available in this function
        // it cannot be accessed anywhere else
        $variable = 'Hello World';

        // However, you can access any of the other variables listed above
        // like so
        $this->i_am_public = 'public';
        $this->i_am_protected = 'protected';
        $this->i_am_private = 'private';

        // Write these variables
        echo $this->i_am_public;
        echo $this->i_am_protected;
        echo $this->i_am_private;
    }
}

$foo = new foo;

$foo->foo_function();

// You can change any publicly defined variables outside
// of the class instance like so
$foo->i_am_public = 'testing';

質問に対する具体的な回答

先に進む前に、クラス内でクラスを定義しないことを強くお勧めします。代わりに、後で説明するクラス拡張を使用してください。実際、あなたのコードが機能することに驚いています!

$a_variable を $a_variable として初期化すると、関数内でのみ使用できますよね?

はい、これは関数内でのみ使用できます。関数の外でアクセスしたい場合は、スコープ定義の 1 つを使用して関数の外で定義する必要がありますpublic, protected, private

$a_varialbe を $this->a_variable として初期化すると、2 番目のクラス内でのみ使用可能になります。正しいですか?

これは、与えるスコープによって異なりますが、とにかくクラス内でクラスを定義するべきではありません。

$a_variable を $first->second->a_variable として初期化できますか? もしそうなら、私はそれを#1、#2、#3でどのように呼びますか?

クラス内にクラスをネストしたことがないので、これには答えられません。もう一度、この構造を変更することをお勧めします。

$a_varialbe を $this->second->a_variable として初期化できますか? もしそうなら、私はそれを#1、#2、#3でどのように呼びますか?

上記の回答を参照してください:-)

クラスの入れ子

前述のように、私はこれまでに見たことがなく、それが機能することに驚いています。この構造は必ず変更する必要があります。

1 つの提案は、次のような拡張機能を使用することです。

class foo{

    // This can be accessed anywhere
    public $i_am_public;

    // This can be accessed within this class and any sub classes
    protected $i_am_protected;

    // Thi can only be accessed within this class
    private $i_am_private;

    public function foo_function(){

        echo 'Hello World';
    }
}

class bar extends foo {

    // This is a public function    
    public function baz(){

        // These will work
        $this->i_am_public = 'public';
        $this->i_am_protected = 'protected';

        // This will not work as it is only available to
        // the parent class
        $this->i_am_private = 'private';
    }
}

// This will create a new instance of bar which is an 
// extension of foo. All public variables and functions
// in both classes will work
$bar = new bar;

// This will work because it is public and it is inherited
// from the parent class
$bar->foo_function();

// This will work because it is public
$bar->baz();
于 2012-11-20T08:18:48.327 に答える