web-dev-qa-db-ja.com

PHPではどこで、なぜ__toString()を使用するのですか?

私はそれがどのように機能するかを理解していますが、なぜ実際にこれを使用するのでしょうか?

<?php
    class cat {
        public function __toString() {
            return "This is a cat\n";
        }
    }

    $toby = new cat;
    print $toby;
?>

これはこれと同じではありません:

<?php
    class cat {
        public function random_method() {
            echo "This is a cat\n";
        }
    }

    $toby = new cat;
    $toby->random_method();
?>

他のパブリックメソッドを使用してテキストを出力することはできませんか?なぜこのような魔法の方法が必要なのですか?

26
Stann

あなたはそれを「必要としない」。ただし、これを定義すると、オブジェクトを暗黙的に文字列に変換できるので便利です。

echoを直接メンバー関数に含めることは、クラス自体への出力の制御が多すぎるため、不適切な形式と見なされます。メンバー関数から文字列を返し、呼び出し元がそれらをどう処理するかを決定できるようにします。変数に格納するか、echo出力するかなどです。魔法の関数を使用すると、これを行うために明示的な関数呼び出しは必要ありません。

既存のすべての回答に加えて、ここに例があります:

_class Assets{

  protected 
    $queue = array();

  public function add($script){
    $this->queue[] = $script;
  }

  public function __toString(){    
    $output = '';    
    foreach($this->queue as $script){
      $output .= '<script src="'.$script.'"></script>';
    }    
    return $output;
  }

}


$scripts = new Assets();
_

これは、JavaScriptの管理に役立つ単純なクラスです。 $scripts->add('...')を呼び出して、新しいスクリプトを登録します。

次に、キューを処理し、登録されているすべてのスクリプトを印刷するには、_print $scripts;_を呼び出すだけです。

明らかにこのクラスはこの形式では無意味ですが、アセットの依存関係、バージョニング、重複する包含のチェックなどを実装すると、意味が出てきます( )。

基本的な考え方は、このオブジェクトの主な目的は文字列(HTML)を作成することであるため、この場合の__toStringの使用は便利です...

13
nice ass

これは、オブジェクトの文字列表現を生成するための標準化されたメソッドにすぎません。きみの random_methodアプローチは、プログラム内のすべてのオブジェクトが同じメソッドを使用すると想定している場合に機能しますが、サードパーティのライブラリを使用している場合はそうではない可能性があります。

マジックメソッドは必要ありませんが、明示的に呼び出す必要がないため、便利です。

また、PHPが内部でオブジェクトをテキストに変換したい場合は、その方法を知っています。

5
falstro

__toString()は、オブジェクトが関数に渡されるときに呼び出されます(特に、echo()またはprint())、そのコンテキストが文字列であると予想される場合。オブジェクトは文字列ではないため、__toString()はオブジェクトの文字列表現への変換を処理します。

4

__toStringメソッドを使用すると、クラスは、文字列のように扱われるときにどのように反応するかを決定できます。

http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring

3
John Giotta

__toStringを使用すると、オブジェクトが文字列に変換されるときの出力を定義できます。これは、関数の戻り値ではなく、オブジェクト自体をprintできることを意味します。多くの場合、これはより便利です。 手動入力 を参照してください。

1
lonesomeday

ToStringメソッドを特別に呼び出す必要はありません。オブジェクトを出力するときはいつでも、toStringが暗黙的に呼び出されます。その他のメソッドは、明示的に呼び出す必要があります。

0
Dennis Traub