Скопируйте функцию на лету PHP
Я работаю над проектом, который требует, чтобы функция копировалась и выполнялась на лету, а переменные в ней также должны быть заменены на лету.
Простой пример будет таким:
function myfunction()
{
$abc = $_SESSION['abc'];
return $abc;
}
Я хочу иметь возможность вызывать myfunction1(), который физически НЕ существует в коде, но делает то же самое, что и выше, за исключением того, что теперь он принимает значения из моей пользовательской переменной, так что это будет выглядеть так:
function myfunction1()
{
$abc = $myCustomVariable;
return $abc;
}
Любая помощь, пожалуйста?
3 ответа
Чем больше вы описываете, насколько сложна ваша функция, тем больше она звучит как идеальный кандидат на объект с внедренными зависимостями.
Например, вы могли бы иметь (просто собираюсь описать основные интерфейсы здесь):
class myClass
{
public function __construct($provider DataProvider)
{
$this->provider = $provider;
}
// Please name this something better
public function doStufferer()
{
if ($this->provider->hasParam('foo'))
{
return $this->provider->getParam('foo');
}
}
}
class SessionProvider implements DataProvider
{
// Session specific stuff
}
class OtherProvider implements DataProvider
{
// Other provider stuff
}
interface DataProvider
{
public function getParam($key);
public function hasParam($key);
public function setParam($key, $value);
}
Затем вы можете использовать его так:
$dataProcessor = new myClass(new SessionProvider);
// OR $dataProcessor = new myClass(new OtherProvider);
$dataProcessor->doStufferer();
Пожалуйста, взгляните на PHP классы и объекты и другие связанные темы.
Вот для чего нужны параметры, я думаю, что вы ищете что-то вроде этого:
$myCustomVariable = 'Some value';
function myfunction($var=$_SESSION['abc'])
{
$abc = $var;
return $abc;
}
myfunction(); //returns $_SESSION['abc']
myfunction($myCustomVariable); //returns "Some Value"
Прямой ответ eval
который я не рекомендую.
Вы можете сделать так, чтобы ваша функция принимала параметр, как этот.
function myfunction1($some_var)
{
$abc = $some_var;
return $abc;
}
// call it like...
myfunction1($myCustomVariable);
Если вам нужен доступ к переменной, но имя генерируется динамическим кодом, вы можете использовать $GLOBALS
,
function myfunction1($name_of_var)
{
$abc = $GLOBALS[$name_of_var];
return $abc;
}
// call it like...
$myCustomVariable = 'a value'
myfunction1('myCustom' + 'Variable');