callable

Whiter

Новичок
Приветствую. Подскажите, пожалуйста. Есть следующий код:

Код:
class Someclass
{
    public methodPrint($x, $y)
    {
        return $x + $y;
    }
}

function functionPrint($x, $y)
{
    return $x + $y;
}

function myFunction(callable $f, $a)
{
    return $f($a);
}

$object = new Someclass();
$x = 1;
$y = 2;


Вопросы:
1) как вызвать функцию myFunction таким образом, что бы выполнилось $object->methodPrint($x,$y)?
2) как вызвать функцию myFunction таким образом, что бы выполнилось functionPrint($x, $y)?
 

Whiter

Новичок
Спасибо, но я там уже был. Из там прочитанного я понял, что можно использовать call_user_func, а так же как передать одну переменную в контексте данного примера. Но как передать две переменные, не используя call_user_func, а используя существующую в примере myFunction я не понял.

Если это возможно, то, пожалуйста, не ограничивайтесь ссылками на мануалы, а напишите пример кода. Спасибо.
 

Вурдалак

Продвинутый новичок
1) как вызвать функцию myFunction таким образом, что бы выполнилось $object->methodPrint($x,$y)?
По ссылке есть пример.

2) как вызвать функцию myFunction таким образом, что бы выполнилось functionPrint($x, $y)?
В практическом смысле — никак, просто сравни количество аргументов, которые принимает функция и которые ты передаешь. Но если это типа головоломка, то можно сделать через замыкание, а вторым аргументом передавать какой-то массив.
 

Sufir

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

Но если уж извращаться и при этом всё-таки поправить объявление метода methodPrint, то можно так:
PHP:
myFunction(function($args) use ($object) {
    return call_user_func_array([$object, 'methodPrint'], $args); // Ну, или как угодно уже вызывать здесь нужный метод с переданными аргументами
}, [$x, $y]);

myFunction(function($args) {
    return call_user_func_array('functionPrint', $args); // Ну, или как угодно уже вызывать здесь нужную функцию с переданными аргументами
}, [$x, $y]);
http://ideone.com/1H4iMU
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
мне всегда казалось, что карринг делается в обратную сторону, избавляясь от параметров а не добавляя их
ну а вообще не тестя
PHP:
$object = new Someclass();
$x = 1;
$y = 2;

echo myFunction(function($a) use ($x, $object) {
  return $object->methodPrint($a, $x);
}, $y);

echo myFunction(function($a) use ($x) {
  return functionPrint($a, $x);
}, $y);
а не правильно (карринг)
 
Последнее редактирование:

Whiter

Новичок
мне всегда казалось, что карринг делается в обратную сторону, избавляясь от параметров а не добавляя их
ну а вообще не тестя
PHP:
$object = new Someclass();
$x = 1;
$y = 2;

echo myFunction(function($a) use ($x, $object) {
  return $object->methodPrint($a, $x);
}, $y);

echo myFunction(function($a) use ($x) {
  return functionPrint($a, $x);
}, $y);
а не правильно (карринг)
То что нужно. Спасибо!
 

WMix

герр M:)ller
Партнер клуба
@WMix, я запутался.
Можешь пояснить, как работает твой код? >.<
PHP:
$x = 1;
$f = function($a) use ($x) { // в этот момент $f запомнила $x
  return functionPrint($a, $x);
}
echo myFunction($f, $y); // используем и добавляем недостающий параметр
вообще карринг несколько сложнее
PHP:
function curry( $x ){
  return function($a) use ($x) {
    return functionPrint($a, $x);
  }
}
$f = curry( $x );// в этот момент вернули callback $f который помнит $x 
echo myFunction($f, $y); // используем и добавляем недостающий параметр
 

Adelf

Administrator
Команда форума
А так понятней?

PHP:
$object = new Someclass();
$x = 1;
$y = 2;

echo myFunction(function($a) use ($x, $y, $object) {
  return $object->methodPrint($x, $y);
}, null);

echo myFunction(function($a) use ($x, $y) {
  return functionPrint($x, $y);
}, null);
 

AnrDaemon

Продвинутый новичок
Непонятно. Надо ещё аспирина и поспать. x.x
Болеть - вредно. Не болейте!
 
Сверху