2016-07-11 1 views
0

У меня есть сомнение, что, может быть, кто-то может ответить здесь. Мой код отлично работает, но я уверен, что я делаю это как-то неправильно. Должен быть более простой и понятный способ добиться этого.Как вызвать функцию с аргументами в функции с аргументами

Пусть этот класс:

class myClass { 
    public static function myFunctionOne ($arg_one, $arg_two, $arg_tree) { 
     echo $arg_one; 
     myClass::$arg_two($arg_tree); 
    } 
    public static function myFunctionTwo ($arg_four) { 
     echo $arg_four; 
    } 
} 

Затем вы вызываете выше класса где-то (мой случай а HTML меню встроенный в PHP файл), как показано ниже:

myClass::myFunctionOne('echo a string', 'myFunctionTwo', 'echo forth value'); 

Это прекрасно работает, и это выходы:

echo a string echo forth value 

Но это законно?

Это выглядит отрывочно для меня. Могу ли я использовать такие функции, чтобы вызвать функцию с помощью Argumetns в функции с аргументами?

+1

Да, это законно. Подобно этому вы можете динамически вызывать функции, зависящие от пользовательского ввода. Вы также можете проверить http://php.net/manual/de/function.call-user-func.php. Другой вопрос: вам действительно нужны динамические вызовы функций? В основном ** не **. – Xatenev

+0

ну, я почти уверен, я мог бы сделать это по-другому, но вышеприведенный случай - всего лишь обобщенный фрагмент того, что я делаю. В настоящее время я пытаюсь изучить ООП (и да, выше всего ООП я предполагаю: P). Вышеупомянутая часть - это лишь небольшая часть более крупного бутстрап-аккордеона, где я хочу создать вкладки id и href, но ALSO вызвать тело и название меню с одной и той же функцией в одном, просто изменив аргументы. Наверное, есть лучшие способы, но каждый учится на пути :) Большое вам спасибо за подтверждение того, что это законный способ, а не случай «это работает случайно» :) – smileBeda

+0

Это работает. – peter

ответ

2

Вы можете это сделать? Абсолютно. Должны ли вы это сделать? Возможно, нет.

В PHP это называется Variable Functions. В принципе, любая переменная с прикрепленным к ней ( будет использоваться как имя функции или метода для вызова.

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

Однако, по другим причинам это может быть не большой дизайн, и это может затруднить работу с кодом. Вероятно, это нарушает принципал Abstraction для звонящих myClass::myFunctionOne(), чтобы знать, какие методы/функции имеют и какие аргументы они принимают.

Обратите внимание, что здесь я использую термин «функция», но если он находится внутри класса, его называют «методом».

+0

Обратите внимание, что вы также можете использовать' self :: myFunctionOne() 'вместо' myClass :: myFunctionOne() '. – Will

+0

, но self :: работал бы только внутри класса, не так ли? Я вызываю класс в отдельный файл. – smileBeda

+1

Правильно. 'self ::' предназначен только для класса, как в вашем примере. Поэтому оставьте это так, как у вас есть для внешнего статического вызова, о котором вы говорите. – Will