[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: как увидеть внешние переменные внутри функции
GRean
Всем привет!

столкнулся с такой проблемой:



$i = 2;

function f()
{

echo $i; // выводит error(undefined)

}



Я понимаю, что внешние переменные не могут быть доступными внутри функции, но как сделать так, что бы без добавления в аргумент функции увидеть переменную внутри функции?

Пример применения, это например в качестве переменной выступает объект со свойствами или массив с данными, которые не хотелось бы по сто раз создавать когда будет вызван какой нибудь из методов.



Спустя 15 минут, 57 секунд (24.12.2010 - 10:20) hellmin написал(а):
function f()
{
global $i;

echo $i; // выводит error(undefined)

}

Спустя 9 минут, 46 секунд (24.12.2010 - 10:30) GRean написал(а):
Спасибо, работает. Я думал, что только через классы работает

Спустя 21 минута, 23 секунды (24.12.2010 - 10:52) twin написал(а):
Цитата
Я думал, что только через классы работает

Через классы тоже не работает. Если внешние.

Спустя 21 минута, 37 секунд (24.12.2010 - 11:13) GRean написал(а):
Цитата (twin @ 24.12.2010 - 07:52)
Цитата
Я думал, что только через классы работает

Через классы тоже не работает. Если внешние.

вот такой костыль:





Class testA{

function f1(){

echo $this->var;

}

}





$memory = new testA();

$memory->var = 1;

$memory->f1();



Цель вообшще сделать API для своего движка, что бы с движком можно было работать на уровне команд в виде вызова функций без обязательного прицепа "общих данных" в виде аргумента.

Спустя 43 минуты, 4 секунды (24.12.2010 - 11:56) linker написал(а):
Вот только в этом случае $memory так и останется невидим для других функций и методов.

Спустя 38 минут, 12 секунд (24.12.2010 - 12:35) GRean написал(а):
Цитата (linker @ 24.12.2010 - 08:56)
Вот только в этом случае $memory так и останется невидим для других функций и методов.

$memory будет не доступен для тех, кто вне класса

Спустя 2 часа, 6 минут, 41 секунда (24.12.2010 - 14:41) linker написал(а):
$memory будет недоступно внутри функций и методов. Показываю о чем речь

Class testA
{
function f1() { echo $this->var; }
}


$memory = new testA();
$memory->var = 1;
$memory->f1();

function testB()
{
$memory->f1(); // Вот тут будет ошибка.
}
Сие равносильно предыдущему
$i = 2;
function f()
{
echo $i; // выводит error(undefined)
}


Спустя 1 час, 45 минут, 18 секунд (24.12.2010 - 16:27) GRean написал(а):
Я про это и говорю, что только в пределах класса.

Спустя 3 часа, 55 минут (24.12.2010 - 20:22) linker написал(а):
Даже в пределах класса $memory не будет видно и только внутри самого объекта $memory можно общаться со своими свойствами через указатель $this.
Class testA
{
function f1()
{
echo $this->var;
echo $memory->var; // ОШИБКА
}
}


$memory = new testA();
$memory->var = 1;
$memory->f1();

Спустя 11 часов, 19 минут, 25 секунд (25.12.2010 - 07:41) GRean написал(а):
Цитата (linker @ 24.12.2010 - 17:22)
Даже в пределах класса $memory не будет видно и только внутри самого объекта $memory можно общаться со своими свойствами через указатель $this.
Class testA
{
function f1()
{
echo $this->var;
echo $memory->var; // ОШИБКА
}
}


$memory = new testA();
$memory->var = 1;
$memory->f1();

поэтому я и назвал, это костылем, так как $memory является мостом между классами и внешними переменными. Здесь речь не о том, что $memory не видно, а о том, что переменную var видно внутри метода с помощью $this->var. Я все равно смогу внутри класса воспользоваться всеми свойствами $memory вызывая как $this. Но мне не нравится конструкия $memory->f(). Я хотел бы вызвывать просто f() + доступ к $memory.

то есть не так

f($memory){

echo $memory->var;

}


а вот так:

f(){

echo $memory->var;

}

Я хочу использовать такие функции в качестве API для своего движка для сайта. Я где читал статью, о том, что объект можно превратить в массив, и в таком случае вроде как пропадает необходимость писать $memory->f(); но так и не разобрался как применить такой метод.

Спустя 2 часа, 13 минут, 13 секунд (25.12.2010 - 09:54) linker написал(а):
Ну ты похоже не понимаешь о чем я говорю. Скажи мне, какая разница между $i и $memory, кроме типа и названия? Не будет $memory никаким мостом и так работать не будет:
function f(){

echo $memory->var; // ОШИБКА

}

Спустя 1 час, 18 минут, 15 секунд (25.12.2010 - 11:12) GRean написал(а):
Цитата (linker @ 25.12.2010 - 06:54)
Ну ты похоже не понимаешь о чем я говорю. Скажи мне, какая разница между $i и $memory, кроме типа и названия? Не будет $memory никаким мостом и так работать не будет:<pre class="sh_sourceCode" rel="php"><span class="sh_keyword">function</span> <span class="sh_function">f</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>

<span class="sh_function">echo</span> <span class="sh_variable">$memory</span><span class="sh_symbol">-></span><span class="sh_keyword">var</span><span class="sh_symbol">;</span> <span class="sh_comment">// ОШИБКА</span>

<span class="sh_cbracket">}</span></pre>


$i как переменная, а $memory грубо говоря массив с данными, который вызван как объект.

И состоит в конструкции класса testA, следовательно имеет общий корень в виде $this, через который можно вытаскивать любые данные, которые прописаны в $memory. $i такого не сможет сделать. Во как загнул

я знаю, что там будет ошибка, это то, что хотелось бы видеть рабочим. А как сделать так, что бы при вызове функции, внутри не было бы ошибки?

Простыми словами: как кроме global сделать так, что бы внешние переменные были доступны внутри функции? Что бы было общее хранилище информации для всех функций. Что бы функции могли получать информацию из одного источника(служебные настройки для сайта) Что то типа мини бд на программном уровне.

Если я захочу передать данные в класс на обработку, то я делаю вот так


Class testA
{
function structure()
{ //-----------------------формирование дерева из бд
$this->tree = Array;
$this->breadcrumbs;

}
function showtree()
{
var_dump( $this->tree);
echo $this->status;

}
}


$memory = new testA();

$memory->status = 1;
$memory->structure = Array;
$memory->action = 'showtree';

$memory->structure();
$memory->showtree();




через теже функции надо только через global или в качестве аргумента передавать. В качестве аргумента не хотелось бы.

Спустя 1 день, 22 часа, 51 минута, 51 секунда (27.12.2010 - 10:04) linker написал(а):
Опуская все неточности скажу, что в твоем случае подойдет Singletone.
Быстрый ответ:

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