Область видимости (использование use)

Vano

Новичок
Как показано в примере ниже, таким способом можна использовать в анонимной функции переменные из родительской области видимости.
PHP:
$frParentScope1 = 1;
$frParentScope2 = 2;


$bla = function() use ($frParentScope1, $frParentScope2)
{
    echo $frParentScope1+$frParentScope2;
};


$bla();
Есть ли возможность сделать тоже самое для обыкновенной функции:
PHP:
$frParentScope1 = 1;
$frParentScope2 = 2;
//и где-то тут что-то еще нужно)
function bla()  // или тут)
{
    echo $frParentScope1+$frParentScope2;
}

bla();
Только без global, global - это с глобальной области брать, а не из родительской.
 
Последнее редактирование:

Adelf

Administrator
Команда форума
Есть.
PHP:
class Bla
{
public $frParentScope1;
public $frParentScope2;

function bla()
{
echo $this->frParentScope1+$this->frParentScope2;
}
}
$bla = new Bla();
$bla->frParentScope1 = 1;
$bla->frParentScope2 = 2;
$bla->bla();
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Использовать переменную внутри функции, ее туда не передав?
 

Adelf

Administrator
Команда форума
Adelf, не хочу класс писать
Ну и дурак :)

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

c0dex

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

Vano

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

флоппик

promotor fidei
Команда форума
Партнер клуба
В пхп у функций нет никакой родительской области видимости, кроме глобальной.
 

Vano

Новичок
Вот для чего нужен оператор "use" в контексте использования пользовательских функций:
PHP:
class A
{
  
    public function __call($method, $args = false)
    {
        call_user_func($this->$method, $args);
    }
  
}


$A = new A;
$A->name = 'Sanya';


$A->sayMyName = function() use ($A){
    echo 'Hello! My Name is '.$A->name;
};



$A->sayMyName();
Ведь пользовательская функция вызивается вне контекста обьекта, что можна проверить таким способом:
PHP:
$A->sayMyName = function() {
    echo 'Hello! My Name is '.$this->name;    //Выведет ошибку: использование $this вне контекста обьекта
};
Тоесть, оператор use (в контексте пользовательских функций) используется для передачи в управления пользовательской функции чего-нибудь.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
PHP:
$A = new A;
$A->name = 'Sanya';
$B = new A;
$B->name = 'Petja';

$A->sayMyName = function() use ($B){
    echo 'Hello! My Name is '.$B->name;
};

$A->sayMyName();
 

MiksIr

miksir@home:~$
Vano, меньше говнокода - меньше проблем.
PHP:
-call_user_func($this->$method, $args);
+call_user_func($this->$method->bindTo($this), $args);
 

Vano

Новичок
Да все правильно я изъяснил. Нужно уточнить, лишь, что главной причиной использовать use, не являеться передача в пользование $this.
 
Сверху