Не работает корректно __get/__set

Olrand

Новичок
Здравствуйте. Я новичек, учу сейчас ооп на PHP. Возникла проблема с __get, хотя возможно и с __set, в общем значение в атрибут класса не записывается/не выводится. Вот код:
PHP:
<?php

class test {
    var $attr;
   
    function __construct ($classparam, $classparam2) {
        echo $classparam;
        echo $classparam2;
    }
   
    function __set ($attrname, $value) {
        $this->$attrname = $value;
    }
   
    function __get ($attrname) {
        return $this->$attrname."_getted";
    }
}

$t = new test("One", " Two");
$t->$attr = "3";
echo $t->$attr;

?>
 

AnrDaemon

Продвинутый новичок
Эээ… Чем больше вчитываюсь, тем больше ошибок нахожу :D
@Olrand, работать не будет, по двум причинам как минимум.
Марш читать http://php.net/OOP
 

fixxxer

К.О.
Партнер клуба
var (устар.) = public
magic-и вызываются только в том случае, если в контексте вызова переменная не определена или недоступна.

И еще, to get - неправильный глагол, get - got - got[ten]. Слова "getted" нет.
 

Olrand

Новичок
@Olrand, и ошибок не выводит?
Никакой ошибки не выводит.

var (устар.) = public
magic-и вызываются только в том случае, если в контексте вызова переменная не определена или недоступна.
Я пробовал ставить public и private тоже, результат тот же.

И еще, to get - неправильный глагол, get - got - got[ten]. Слова "getted" нет.
ок)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Olrand, включи вывод ошибок, сразу станет понятно, что же ты там написал.
 

Olrand

Новичок
Сейчас у меня такой код:
Код:
<?php

class test {
  
    public $attr;
  
    function __construct ($classparam, $classparam2) {
        echo $classparam;
        echo $classparam2;
    }
  
    function __set ($attrname, $value) {
        $this->$attrname = $value;
    }
  
    function __get ($attrname) {
        return $this->$attrname;
    }
  
}

$t = new test("One", " Two");
$t->$attr = "abc";
echo $t->$attr;

?>
выводит такие ошибки
https://drive.google.com/file/d/0B4DwMXT_TtQWRTRraTZvN3FKM2s/view?usp=sharing
 

Olrand

Новичок
что не определена переменная $attr, но я же ее вроде определил, даже когда ставлю в коде public $attr = "a";, все равно та же ошибка.
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Не, не определил. Надо брать книгу и разбираться в областях видимости переменных и т.д.
 

Olrand

Новичок
Все, разобрался) Дело не в области видимости, при обращении к атрибуту класса не нужно использовать знак "$": $t->attr = "abc" например. Какие-то новые правила потому что в моей книге показано обращение со знаком доллара.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Olrand, не ври, пожалуйста, не может быть такого в нормальной книге. И ты, скорее всего, просто не понял о чем там речь. Обращение должно идти без знака доллара, но бывают случаи когда надо значение переменной сделать именем свойства в классе - вот тогда...
 

Vano

Новичок
PHP:
$blah = 'attr';   // просто строка
var_dump($blah); // STRING  тут доказано

if ($t->attr === $t->$blah) {  // теперь проверим вернет ли то же самое вызвав аттрибут через настоящее название attr или $blah через название которое находится в переменной
    echo 'Тоже самое';
}
 
Последнее редактирование:

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Vano, если приводишь пример, то пиши его чуть более полно, автор может тебя не понять.
 

fixxxer

К.О.
Партнер клуба
Все, разобрался) Дело не в области видимости, при обращении к атрибуту класса не нужно использовать знак "$": $t->attr = "abc" например. Какие-то новые правила потому что в моей книге показано обращение со знаком доллара.
Не разобрался.
$this->foo - прямое обращение к свойству foo
$this->$attrname - динамическое обращение к свойству, имя которого содержится в строковой переменной $attrname.
В __get/__set ты обращаешься к свойству класса динамически по переданному в первом аргументе имени, потому там и $this->$. Ты просто сам себя запутал похожими именами attr и attrname.
 

Olrand

Новичок
Не разобрался.
$this->foo - прямое обращение к свойству foo
$this->$attrname - динамическое обращение к свойству, имя которого содержится в строковой переменной $attrname.
В __get/__set ты обращаешься к свойству класса динамически по переданному в первом аргументе имени, потому там и $this->$. Ты просто сам себя запутал похожими именами attr и attrname.
Не буду спорить) Главное что для себя лично я понял что к чему, у меня как раз была ошибка в прямом обращении к свойству извне определения класса.
 

Olrand

Новичок
@Olrand, не ври, пожалуйста, не может быть такого в нормальной книге. И ты, скорее всего, просто не понял о чем там речь. Обращение должно идти без знака доллара, но бывают случаи когда надо значение переменной сделать именем свойства в классе - вот тогда...
Там действительно дальше в книге идет обращение без $ в примерах и благодаря ответу @fixxxer я понял что сначала было показано динамическое обращение к свойству). Так что прошу не ругать, я просто не силен в терминологии и потому написал не совсем точно)
 
Сверху