Очевидное решение eval, но оно не годится по некоторым соображениям.
Переменные создаются легко и просто путем указания & у параметра функции, но со ссылками этот номер не проходит.
class Ca {
static $b=array();
}
function setvar(...)
{
// ...
}
function foo()
{
setvar(...);
// $b=&$Ca::b;
$b['test']=3;
print_r($Ca::b['test']);
}
Посоветуйте реализацию функции setvar(...);
которая бы создавала в контексте вызывающей функции ссылку типа
$b=&$Ca::b;
Но $b должна быть локальной переменной функции foo(), а global какой нибудь
Спустя 7 часов, 3 минуты, 54 секунды (2.12.2011 - 14:46) minor написал(а):
Лучше напишите для чего это все и что вы делаете , скорее всего вы не в том направлении ишите ответ.
Спустя 58 минут, 38 секунд (2.12.2011 - 15:45) Гость_tester написал(а):
Цитата |
Лучше напишите для чего это все и что вы делаете |
Вряд ли что поможет
Вообще это для многозадачности.
Существует много функций в начале каждой из которых есть совершенно одинаковая инициализация нескольких переменных. Но копировать 100 раз 20 строчек кода в каждую не очень прикольно. И кроме того хотелось бы вынести эту инициализацию с глаз долой. Тогда ее можно было бы например зазендить и не светить клиентам.
Спустя 1 час, 7 минут, 57 секунд (2.12.2011 - 16:53) I++ написал(а):
Первый вариант:
Второй вариант:
Если изменить код так:
$Ca не будет доступен внутри функции foo, вместо этого будет ссылка на него в виде переменной $b (для первого варианта)
<?php
class Ca
{
public $b = array(123);
}
foo();
function &setvar()
{
global $Ca;
if(!isset($Ca))
$Ca = new Ca();
return $Ca->b;
}
function foo()
{
global $Ca;
$b = &setvar();
$b['test'] = 3;
var_dump($Ca);
}
?>
Второй вариант:
<?php
class Ca
{
public $b = array(123);
}
foo();
function &setvar()
{
if(!isset($GLOBALS['CA']))
$GLOBALS['CA'] = new Ca();
return $GLOBALS['CA']->b;
}
function foo()
{
$b = &setvar();
$b['test'] = 3;
var_dump($GLOBALS['CA']);
}
?>
Если изменить код так:
function foo()
{
$b = &setvar();
$b['test'] = 3;
var_dump($b);
}
$Ca не будет доступен внутри функции foo, вместо этого будет ссылка на него в виде переменной $b (для первого варианта)
Спустя 1 час, 27 минут, 40 секунд (2.12.2011 - 18:21) Guest написал(а):
Эти решения не подходят. Переменных надо инициализировать много, а в классе массив статический.
Но всем спасибо, задача решена.
Но всем спасибо, задача решена.
function setvar(&$arr)
{
$arr['t']=&Ca::$b['test'];
$arr['d']=&Ca::$rrr;
}
function foo()
{
setvars($_a);foreach($_a as $_key=>&$_val){$$_key=&$_val;} unset($_a);
}
Спустя 46 минут, 26 секунд (2.12.2011 - 19:07) Guest написал(а):
P.S. правда при таком решении время выполнения одной задачи выросло с 13 до 22 микросекунд
Спустя 19 минут, 49 секунд (2.12.2011 - 19:27) I++ написал(а):
Если не затруднит, можете сделать "экзампл" логики работы? На подобии как сделал я, когда отписывался. Просто не совсем ясен смысл выше описанного кода.
Спустя 6 минут, 33 секунды (2.12.2011 - 19:33) Guest написал(а):
В данном примере создаются 2 локальных переменных являющиеся ссылками
$t -> &Ca::$b['test'];
$d -> &Ca::$rrr;
Вообщем все ссылки и переменные для которых есть ключи в массиве заполненном в setvar.
Какие ключи там проинициализированы такие переменные и создадутся.
$t -> &Ca::$b['test'];
$d -> &Ca::$rrr;
Вообщем все ссылки и переменные для которых есть ключи в массиве заполненном в setvar.
Какие ключи там проинициализированы такие переменные и создадутся.