Динамическое создание переменных класса в PHP4

Defiler

Новичок
Динамическое создание переменных класса в PHP4

Доброго времени суток!
Такая вот проблема возникла. Нужно создавать переменные класса динамически.
Попробовал вот таким способом:
PHP:
eval("\$this->".$var_name."=\"".$var_value."\";");
В принципе работает, но ежу понятно, что такой метод жутко небезопасный. Тем более, что $var_name и $var_value будут браться из GET/POST запросов. Т.е. придется делать еще и кучу проверок.
Вопрос такой: есть ли ещё способы динамического создания переменных класса ? Например какими-то стандартными средствами ПХП(в мануале ничего похожего не нашел)
 

kSalex

Новичок
что-то ты не правильно делаешь, формировать динамически переменные класса - это бред.
Может лучше что-то типа этого:
PHP:
class test
{
    var $get_post;

    function test(){
        $this->get_post['get']=$_GET;
        $this->get_post['post']=$_POST;
    }

}
или вообще сделать отдельные переменные для гет-а и пост-а
 

svetasmirnova

маленький монстрик
Defiler
1. eval тебе зачем?
2. Зачем тебе вообще "Динамическое создание переменных класса"?
 
kSalex
[offtop]
тогда, уж...
PHP:
class test 
{ 
    var $get_post; 

    function test( $get, $post ){ 
        $this->get_post['get']   = $get; 
        $this->get_post['post'] = $post; 
    } 

}

$t = new test;
$t.test( $_GET, $_POST );
 

kSalex

Новичок
Loshadka и при создании писать эти ещё параметры ? - нафига оно надо.
а это что:
?

А вообще создателю темы вроде не интересно, так что забудем....
 
kSalex
> и при создании писать эти ещё параметры ? - нафига оно надо.
т.е.?
класс - это закрытый объект... и очень плохо, если он использует какие-то глобальные объекты...

-~{}~ 08.12.05 14:50:
да, сорри...
PHP:
$t = new test( $_GET, $_POST );
 

Claymore

Guest
установка из хэша
PHP:
function Set($arr) {  
    foreach($arr as $key => $val )   		
        $this->{$key} = $val;		  
}
Иногда это нужно.
 

kSalex

Новичок
Loshadka ну вопервых никто ему объекты не передаёт, это глобальные переменные.
 
kSalex
да блин, пофиг...
это - внешнее и к классу это - не имеет никакого отношения!
если классу что-то и передается то только в параметрах методов, конструкторов и т.д.
 

_RVK_

Новичок
Defiler


Твой способ неверен вообще. Всем здесь отвечавшим читать ссылку и просвещаться :)

Предупреждая возражения: эти методы доступны и в php4

-~{}~ 08.12.05 15:20:

>_RVK_ - Defiler спрашивал для 4-ки

Вот, так и знал :)
 

Defiler

Новичок
_RVK_, спасибо! Это как раз то что мне нужно.
И всё же в четверке не работает :(
PHP:
<?
class a {
    var $x;
    var $values = array();

    function a() {
        $this->x = 1;
    }

    function __get($nm) {
        if(isset($this->values[$nm])) {
            $r = $this->values[$nm];
            return $r;
        }
    }

    function __set($nm, $val) {
        if(isset($this->values[$nm])) {
            $this->values[$nm] = $val;
        }
    }


    function add_var($var_name, $var_value) {
        $this->values[$var_name] = $var_value;
    }

}
$k = new a();
$k->add_var("var1", "value");
print "Before: " . $k->var1 . "\n";
$k->var1 = "value1";
print "After: " . $k->var1 . "\n";
var_dump($k);
?>
Вот что выводит:

Before:
After: value1
object(a)(3) {
["x"]=>
int(1)
["values"]=>
array(1) {
["var1"]=>
string(5) "value"
}
["var1"]=>
string(6) "value1"
}
 

_RVK_

Новичок
Зачем проверка на isset в __set?

Кстати это работает начиная с php4.3
 

Frol

Новичок
в четверке это работает, но так глючно, что лучше бы не работало. :)
 

Defiler

Новичок
Автор оригинала: _RVK_
Зачем проверка на isset в __set?
Потому что для добавления переменной есть функция add_var.
Кстати это работает начиная с php4.3
У меня 4.4.0
В принципе, если мне удастся уговорить админа поставить на сервак 5-й пхп, то и вопрос можно будет считать решенным.

-~{}~ 10.12.05 10:32:

Автор оригинала: svetasmirnova
Главное непонятно зачем оно автору топика.
Хочу создать универсальный класс для работы с переменными /GET/POST/COOKIE
Динамическое добавление необходимо для того, чтобы сократить код, т.е. вместо $a->gpc['var_name'] можно было писать $a->var_name.
 

_RVK_

Новичок
Проверил на 5, все работает. На 4ке проверить нет возможности.

Кстати если ты напишешь $obj->var = 1

то print $obj->var выведет 1
Если имя неизвестно зарание то можно писать как $obj->$var_name.... Но вариант с __get/__set лучше
 
Сверху