[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: создание локальных переменных в одной функции поср
Гость_tester
Столкнулся с задачей создавать инициализированные локальные переменные и ссылки в одний функции посредством другой.
Очевидное решение 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 написал(а):
Цитата
Лучше напишите для чего это все и что вы делаете

Вряд ли что поможет smile.gif
Вообще это для многозадачности. smile.gif
Существует много функций в начале каждой из которых есть совершенно одинаковая инициализация нескольких переменных. Но копировать 100 раз 20 строчек кода в каждую не очень прикольно. И кроме того хотелось бы вынести эту инициализацию с глаз долой. Тогда ее можно было бы например зазендить и не светить клиентам.

Спустя 1 час, 7 минут, 57 секунд (2.12.2011 - 16:53) I++ написал(а):
Первый вариант:

<?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 микросекунд sad.gif

Спустя 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.
Какие ключи там проинициализированы такие переменные и создадутся.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.