Можно ли передать функцию в качестве другого параметра функции? [Дубликат]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

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

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
42
задан Charles 9 February 2014 в 20:34
поделиться

6 ответов

Я думаю, что вы ищете call_user_func .

Пример из руководства PHP:

<?php
function barber($type) {
    echo "You wanted a $type haircut, no problem";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");
?>
77
ответ дан Paolo Bergantino 19 August 2018 в 15:10
поделиться
  • 1
    Грибные прически правильные! – Alex 14 January 2011 в 01:47
  • 2
    и что происходит, когда парикмахер принадлежит к другому классу? другое пространство имен? – abbood 11 June 2014 в 14:19
  • 3
    Это действительно лучший ответ? Он не показывает, что вызов функции изнутри функции был передан как параметр. – PiggyMacPigPig 24 July 2018 в 14:22
  • 4
    @abbood - публичная функция Foo ($ function = null) {... somecode ... return $ this- & gt; $ function (@params); } – PiggyMacPigPig 24 July 2018 в 14:25

Вы также можете использовать call_user_func_array() . Он позволяет передавать массив параметров в качестве второго параметра, поэтому вам не нужно точно знать, сколько переменных вы передаете.

11
ответ дан Matt Fletcher 19 August 2018 в 15:10
поделиться

Я знаю исходный вопрос, заданный о PHP 4.3, но сейчас прошло несколько лет, и я просто хотел отстаивать свой предпочтительный способ сделать это в PHP 5.3 или новее.

PHP 5.3+ сейчас включает поддержку анонимных функций (закрытий) , поэтому вы можете использовать некоторые стандартные методы функционального программирования, как в таких языках, как JavaScript и Ruby (с несколькими оговорками). Переписывание приведенного выше примера call_user_func в «стиле закрытия» будет выглядеть следующим образом:

$barber = function($type) {
    echo "You wanted a $type haircut, no problem\n";
};

$barber('mushroom');
$barber('shave');

Очевидно, это не так много покупает в этом примере - сила и гибкость приходят, когда вы передаете эти анонимные функции другим функциям (как в исходном вопросе). Поэтому вы можете сделать что-то вроде:

$barber_cost = function($quantity) {
    return $quantity * 15;
};

$candy_shop_cost = function($quantity) {
    return $quantity * 4.50;   // It's Moonstruck chocolate, ok?
};

function get_cost($cost_fn, $quantity) {
    return $cost_fn($quantity);
}

echo '3 haircuts cost $' . get_cost($barber_cost, 3) . "\n";
echo '6 candies cost $' . get_cost($candy_shop_cost, 6) . "\n";

Это может быть сделано с помощью call_user_func, конечно, но я считаю этот синтаксис более ясным, особенно после того, как будут задействованы пространства имен и переменные-члены.

Одно предостережение: я буду первым, кто признает, что я точно не знаю, что здесь происходит, но вы не можете всегда вызывать замыкание, содержащееся в членной или статической переменной и, возможно, в некоторых других случаях. Но переназначение его на локальную переменную позволит ему вызываться. Так, например, это даст вам ошибку:

$some_value = \SomeNamespace\SomeClass::$closure($arg1, $arg2);

Но это простое решение проблемы:

$the_closure = \SomeNamespace\SomeClass::$closure;
$some_value = $the_closure($arg1, $arg2);
7
ответ дан mercurial 19 August 2018 в 15:10
поделиться

В php это очень просто.

<?php

function here() {
  print 'here';
}


function dynamo($name) {
 $name();
}

//Will work
dynamo('here');
//Will fail
dynamo('not_here');
24
ответ дан Stewart Robinson 19 August 2018 в 15:10
поделиться
function foo($function) {
  $function(" World");
}
function bar($params) {
  echo "Hello".$params;
}

$variable = 'bar';
foo($variable);

Кроме того, вы можете сделать это таким образом. См. переменные функции .

25
ответ дан tj111 19 August 2018 в 15:10
поделиться
  • 1
    Я думаю, вы немного прыгаете с пистолетом. IIRC, этот код не начнет работать до тех пор, пока не выйдет PHP 5.3. – Jeremy DeGroot 9 March 2009 в 21:06
  • 2
    «Bar» должен быть указан, так как это строка. – Gumbo 9 March 2009 в 21:06
  • 3
    @Jememy DeGroot переменные функции были навсегда – Greg 9 March 2009 в 21:08
  • 4
    Я забыл цитаты, спасибо, что указал. Добавлено их в редактирование. Вы можете сделать это без кавычек в 5.3? – tj111 9 March 2009 в 21:08
  • 5
    Вы можете сделать это без кавычек в старых версиях PHP. Он превращает неизвестный символ в строку и выдает предупреждение (при условии соответствующей отчетности) из-за обесценения поведения (?). – strager 9 March 2009 в 21:12

Если вам нужна функция pass с параметром как параметр, вы можете попробовать следующее:

function foo ($param1){
   return $param1;
}

function bar ($foo_function, $foo_param){
    echo $foo_function($foo_param);
}

//call function bar
bar('foo', 'Hi there');  //this will print: 'Hi there'

Пример phpfiddle

Надеюсь, это будет полезно ...

4
ответ дан waLL e 19 August 2018 в 15:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: