2016-10-14 6 views
3

エコー時に文字列を出力するオブジェクトを呼び出し元に返すだけでなく、アクセスできるプロパティも持っています。あらかじめ定義されたクラスやたくさんのコードがなくても、これをどうすれば実現できますか?クラスを使用することにより作業クラスを使用せずに__toString機能を持つオブジェクトを返す

$obj = func(); // an object should be returned, where: 
echo $obj->prop; // 1) the object has properties 
echo $obj;  // 2) echoing the object itself should echo a specific string 

:おそらく失敗

<? 

class obj { 

    var $head; 
    var $body; 

    function __construct($head, $body) { 
    $this->head = $head; 
    $this->body = $body; 
    } 

    function __toString() { 
    return $this->body; 
    } 

} 

function blah() { 

    return new obj("My head", "My body"); 

} 

$response = blah(); 
echo "$response->head and $response\n"; 

?> 

擬似試み:

<? 

function blah() { 

    $head = "My head"; 
    $body = "My body"; 

    return (object) array(
     "head" => $head, 
     "body" => $body, 
     "__toString" => function() { 
      return $body; 
     }, 
    ); 
} 

$response = blah(); 
echo "$response->head and $response\n"; 

?> 
+0

PHP7以降、[anonymouse classes](http://php.net/manual/en/language.oop5.anonymous.php)を使用することができます。しかし、なぜオブジェクトが必要なのかわかりませんが? 'echo $ response ['head']'というキーで配列を返してエコーすることができます。あなたがオブジェクト上で死んでいる場合は、 '$ clのような標準クラスまたは[typecasting](http://php.net/manual/en/language.types.object.php#language.types.object.casting)を使用してください=新しい\ stdclass(); $ cl-> head = $ head; '次に、結果をエコー$ echo-> headでエコーします。 'と'。 $ res-> body; 'はオプションになります。 –

+0

私は 'echo $ response'だけを行い、専用プロパティ(この場合は' body')を得ることができるオブジェクト( '$ response')を返すことができるようにしたいと同時に' echo $ response - >プロパティを使用して任意のプロパティを取得します。クラスなしでこれを行うことはできますか?あるいは、別の言い方をすれば、これを行う最短の方法は何ですか? – forthrin

答えて

2

@Narfは、オブジェクトがクラスのインスタンスである、右ですが、あなたはPHP docsからPHP 7.

Anonymous Classesようなことを行うことができます。

<?php 

$util->setLogger(new class { 
    public function log($msg) 
    { 
     echo $msg; 
    } 
}); 

あなたの状況にこのアプローチを適用することに興味がある場合は、次のようなものを試してみてください。

<?php 

$response = new class { 
    public function setBody($body) { 
     $this->body = $body; 
    } 

    public function setHead($head) { 
     $this->head = $head; 
    } 

    public function __toString() { 
     return (string) $this->body; 
    } 
}; 

$response->setHead('200 OK'); 
$response->setBody('Lorem Ipsum'); 

echo "$response->head and $response"; // 200 OK and Lorem Ipsum 
+0

Anonymous * class *、まだクラスです。 ;) – Narf

+0

悪くない!匿名クラスは最小限のコードで問題を解決します。単純な配列やオブジェクトを使うことができるかどうかを知りたいのですが、同じ効果を得るためにプロパティや何かをキャストして魔法を使うことができます(私の疑似例を見てください)。PHPは一般に何か... – forthrin

2

オブジェクトがクラスのインスタンスである...あなたはできませんその事実を巡る

そのクラスに制限を設定したい場合は、それを実行してください。あなたは、次の必要なように見えます:


final class Response 
{ 
    private $head, $body; 

    public function __construct($head, $body) 
    { 
     $this->head = $head; 
     $this->body = $body; 
    } 

    public function __toString() 
    { 
     return $this->body; 
    } 

    public function __get($property) 
    { 
     return isset($this->$property) 
      ? $this->$property 
      : null; 
    } 
} 

あなただけそれをそこからプロパティを読み、echoことができ、それがfinalはそれを拡張することができないのです。

関連する問題