2

オーバーロードに関するマニュアルでは、スレッドの 1 つを把握できませんでした。コードは以下のとおりです。

<?php

class a
{
   function __get($v)
   {
       $this->$v = new $v;
       return $this->$v;
   }
}

class b
{
    function say($word){
        echo $word;
    }
}
$a = new a();
$a->b->say('hello world');

// echos 'hello world'
?> 

コメント行で指摘されているように、hello world をエコーし​​ます。しかし、b はインスタンス化されていませんが、どのように呼び出されるのでしょうか? 助けてください。マニュアルへのリンクはここにあります。エントリはgmail dot com の Trash80という名前のユーザーに属しています

4

7 に答える 7

6

機能:

$a->b:

function __get('b'){
    $this->b = new b;
    return $this->b;
}

$a->b->say('hello world'):

function say('hello world'){
    echo 'hello world';
}
于 2012-08-14T14:01:41.710 に答える
4

これは、A の __get メソッドで構築されます。Get は、プロパティを取得しようとしたときに呼び出される魔法のメソッドです。ドキュメントを参照してください。__get には、アクセスされているプロパティ名が文字列として渡されます。その文字列はクラスをインスタンス化してから返すために使用されるため、これは機能します。

以下も同様に機能します。

class a
{
   function __get($v)
   {
       $this->$v = new $v;
       return $this->$v;
   }
}

class b
{
    function say($word){
        echo $word;
    }
}

class c
{
    function say($word){
        echo 'c: ' . $word;
    }
}
$a = new a();
$a->b->say('hello world');

// echos 'hello world'

$a->c->say('hello world');

// echos 'c: hello world'
于 2012-08-14T14:01:24.683 に答える
3

しかし、bインスタンス化されています!

classaのマジック getter メソッド内:

function __get($v)
{
    $this->$v = new $v;
    return $this->$v;
}

後で$v呼び出すときの値は 'b' です。$a->bこれは、行$this->$v = new $v;が実際には次と同等であると評価されることを意味します: $this->b = new b;、次にreturn $this->b;.

要約すると、ゲッターの呼び出し時の評価は次のようになります。

function __get($v)
{
    $this->b = new b;
    return $this->b;
}
于 2012-08-14T14:02:14.380 に答える
2

プロパティ $b は $a に対して定義されていないため、$b は実際にインスタンス化され、$a->$b を呼び出すと ... パラメータ $v = $b で魔法のメソッド __get が呼び出されるため、次の行

$this->$b = new $b; 

実行されます。

于 2012-08-14T14:02:58.770 に答える
1

__get メソッドは魔法のメソッドです。PHP でオブジェクトのプロパティにアクセスしようとしたときに、そのプロパティが定義されていない場合は常に、プロパティ名を引数として __get メソッドが呼び出されます。

したがって、この場合は次のようになります。

$a->b

b はまだ $a のメンバーではないため、b を引数として __get が呼び出されます。次に、これが実行されます:

function __get($v) {
     $this->$v = new $v;
     return $this->$v;
 }

$v を b に置き換えると、次のようになります。

$this->b = new b;

これにより、$a->ba が b の新しいインスタンスになり、それに対して say メンバー関数を呼び出します。

于 2012-08-14T14:02:17.493 に答える
1

ここでインスタンス化されます:$this->$v = new $v;

内訳:

A オブジェクトを作成します $a = new a();

$b = $a->b;

これは動的に呼び出しますa::__get

function __get($v)
{
   $this->$v = new $v;
   return $this->$v;
}

これはオブジェクトを返すbので、効果的にやっています:

$b->say('hello world');
于 2012-08-14T14:03:21.077 に答える
0

PHP ドキュメントで魔法の機能を調べる必要があります。内部のロジック__get()は、の新しいインスタンスを作成して返しますb

于 2012-08-14T14:01:52.953 に答える