2016-10-05 2 views
1

Я не уверен, как лучше всего назвать это, поэтому я подумал, что отправлю пример того, чего я пытаюсь достичь. На данный момент я упростил это.Параметры PHP, закрытие и извлечение

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

abstract class AuditedSave extends AuditedSaveImplementation 
{ 

    public static function run($callback = null) 
    { 
     return new AuditedSaveImplementation($callback); 
    } 

} 

class AuditedSaveImplementation 
{ 

    public function __construct(Closure $closure) 
    { 
     echo ' - I ran before'; // point 1, $test = 0 
     $closure(); 
     echo ' - i ran after!'; // point 2, $test = 1 
    } 

} 

Тогда код, который называет его.

$test = 0; 

AuditedSave::run(function() use ($test) 
{ 
    $test = 1; 
}); 

Так между точками 1 и 2, как заметил, пробеги закрытия и будет установить значение $ теста 1. Тем не менее, я хочу, чтобы сохранить значение все, что передается в качестве первого параметра (в данном случае , $test) в качестве копии того, что было во время вызова функции - которая всегда будет выполняться, тогда замыкание затем изменяет ее (это часть, которая может быть переменной), а затем после этого производится сравнение, и действия происходят на основе различия, которые всегда будут выполняться.

Однако для этого мне нужно иметь доступ к переменной $ test в методе __construct() от AuditedSaveImplementation, не зная, как он называется.

Возможно ли это вообще?

+1

Нет, объем '$ test' - это нечто совершенно иное, чем' AuditedSaveImplementation :: __ construct'. Вы должны переосмыслить все, что вы пытаетесь сделать здесь. – deceze

+2

Невозможно. Переходите в другой класс с соответствующей логикой (например, 'getValue()' и/или 'getOriginalValue()') вместо простого закрытия. Также '$ test' всегда копируется в указанном вами коде (ну, на самом деле это копирование на запись, но это не очень важно). Изменение его не повлияет на исходную переменную. – ShiraNai7

ответ

0

Вы можете использовать метод ReflectionFunction класс getStaticVariables, чтобы получить параметры, переданные в закрытие, через use. Как это:

class AuditedSaveImplementation 
{ 

    public function __construct(Closure $closure) 
    { 
     echo ' - I ran before'; // point 1, $test = 0 
     $closureReflection = new ReflectionFunction($closure); 
     $variables = $closureReflection->getStaticVariables(); 
     var_dump($variables); 
     $closure(); 
     echo ' - i ran after!'; // point 2, $test = 1 
    } 

} 

Но, как упоминалось в комментариях, вы должны переосмыслить то, как вы это делаете. Это нехороший подход. Попробуйте создать специальный класс, как это было предложено в комментариях.

+1

FWIW, это ужасное решение. Для этого должен быть разумный и простой интерфейс, а не решение сгибания назад, которое зависит от деталей реализации. OP просто на неправильном пути ... – deceze

+0

Я просто хотел показать, что это невозможно. То, что все, что передается в закрытие посредством 'use', будет преобразовано в статические переменные для закрытия и может быть извлечено посредством отражения. Но я согласен, что автору нужно переосмыслить, что он здесь делает. –

Смежные вопросы