0

これが可能かどうか疑問に思っています:

__set() マジック メソッドを使用して、クラスのプロパティに値を設定することに成功しました。

class View
{
    private $data;

    public function __set( $key, $value )
    {
         $this->data[$key] = $value;
    }
}

だから私はできる:

$view = new View();
$view->whatever = 1234;

たとえば、文字列を連結したいときに問題が発生します。__set() が呼び出されていないようです (実際には呼び出されていません)。

$view = new View();
$view->a_string = 'hello everybody';    //Value is set correctly

$view->a_string.= '<br>Bye bye!';       //Nothing happens...

echo $view->a_string;

これにより、「hello everyone」が出力されます。2 番目の割り当てで __set() を実行できません。php.net を読むと、次のように書かれています。

__set() is run when writing data to inaccessible properties.

したがって、a_stringが既に存在するため、__set は呼び出されません。私の質問は最終的に...どうすればその連結操作を達成できますか??

注: わかりました... マーフィーが来て、私がこれを投稿するとすぐに答えをくれました...

答え (私が理解しているように) は、__get() メソッドを定義していないため、 a_stringが使用可能かどうかを PHP が判断できないということです。

__get() を定義すると、php はa_stringの現在の値を見つけ、 __set() を使用して値を連結できます。

4

3 に答える 3

4

__set()の場合と同じように、アクセスできないプロパティにアクセスできるようにする__get()メソッドを追加する必要があります。次に、次のことを行うことができます。

$view->myvar = $view->myvar.'Added text.';

__get()メソッドは次のようになります。

public function __get($var) {
  return (isset($this->data[$var])) ? $this->data[$var]: '';
}
于 2010-09-13T21:23:21.223 に答える
1

参考までに、単純な割り当ての場合、魔法のメソッドは必要ありません。

class A {

}

$a = new A();

$a->str = '1';
$a->str .= '2';
echo $a->str;  // outputs 12

PHP は割り当てによって新しいプロパティを作成するため、これは問題なく機能します。__set/get は通常、値に対して追加のチェック/コードを実行する必要がある場合に使用されます。

于 2010-09-13T22:22:33.417 に答える
0

これは、__ set()がメソッドであり、文字列ではないためです。文字列のように「動作」させたい場合は、これに変更できます。

class View
{
    private $data;

    public function __set( $key, $value )
    {
        if (empty($this->data[$key])) {
            $this->data[$key] = $value;
        } else {
            $this->data[$key] .= $value;
        }
    }
}
于 2010-09-13T21:24:50.620 に答える