Скопируйте функцию на лету PHP - PullRequest
0 голосов
/ 11 декабря 2011

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

Простой пример будет таким:

function myfunction()
{
    $abc = $_SESSION['abc'];
    return $abc;
}

Я хочу иметь возможность вызывать myfunction1 (), который физически НЕ существует в коде, но делает то же самое, что и выше, за исключением того, что теперь он принимает значения из моей пользовательской переменной, так что это будет выглядеть такэто:

 function myfunction1()
 {
     $abc = $myCustomVariable;
     return $abc;
 }

Любой, пожалуйста, помогите?

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

Вот для чего нужны параметры, я думаю, что вы ищете что-то вроде этого:

$myCustomVariable = 'Some value';


function myfunction($var=$_SESSION['abc'])
{
    $abc = $var;
    return $abc;
}

myfunction(); //returns $_SESSION['abc']
myfunction($myCustomVariable); //returns "Some Value"
1 голос
/ 11 декабря 2011

Чем больше вы описываете, насколько сложна ваша функция, тем больше она звучит как идеальный кандидат на объект с внедренными зависимостями.

Например, вы могли бы иметь (просто собираюсь описать основные интерфейсы здесь):

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 и другие связанные темы.

0 голосов
/ 11 декабря 2011

Прямой ответ: 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...