__set и конкатенация строк - PullRequest
0 голосов
/ 14 сентября 2010

Мне интересно, возможно ли это:

Я успешно использовал магический метод __set () для установки значений свойств класса:

class View
{
    private $data;

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

Так что я могуto:

$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;

Это выводит "всем привет".Я не могу выполнить __set () во втором назначении.Читая php.net, он говорит, что:

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

Так как a_string уже существует, __set не вызывается.Мой вопрос, наконец, таков: как я могу выполнить эту операцию конкатенации?

Примечание: Хорошо ... Мерфи пришел и дал мне ответ, как только я разместил это ...

Ответ (как я понял) заключается в том, что PHP не может решить, доступна ли a_string , поскольку я не определил метод __get ().

Определение __get () позволяет php найти текущее значение a_string , а затем использует __set () для конкатенации значения.

Ответы [ 3 ]

4 голосов
/ 14 сентября 2010

Вы должны добавить метод __get (), который позволяет вам получить доступ к недоступным свойствам, как вы это сделали с __set (). Затем вы можете сделать следующее:

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

Метод __get () будет выглядеть следующим образом:

public function __get($var) {
  return (isset($this->data[$var])) ? $this->data[$var]: '';
}
1 голос
/ 14 сентября 2010

К вашему сведению, для простого назначения магические методы даже не нужны.

class A {

}

$a = new A();

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

Это будет прекрасно работать, так как PHP создаст новые свойства с помощью присваивания. __set / get обычно используется, когда необходимо выполнить дополнительные проверки / код для значений.

0 голосов
/ 14 сентября 2010

Это потому, что __set () - это метод, а не строка.Если вы хотите, чтобы он «действовал» как строка, вы можете изменить его на следующее.

class View
{
    private $data;

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