gpt4 book ai didi

php - 是否可以在 PHP 中进行方法调用?

转载 作者:行者123 更新时间:2023-12-04 12:59:10 24 4
gpt4 key购买 nike

我有一个 SoapClient为 WSDL 文件生成的实例。除了其中一个方法调用之外,所有方法调用都需要传递用户名和密码 id。

有没有办法对方法调用进行柯里化(Currying),以便我可以省略用户名和密码?

最佳答案

这是一个实现自动柯里化(Currying)和部分应用的类:

class lambda
{
private $f;
private $args;
private $count;
public function __construct($f, $args = [])
{
if ($f instanceof lambda) {
$this->f = $f->f;
$this->count = $f->count;
$this->args = array_merge($f->args, $args);
}
else {
$this->f = $f;
$this->count = count((new ReflectionFunction($f))->getParameters());
$this->args = $args;
}
}

public function __invoke()
{
if (count($this->args) + func_num_args() < $this->count) {
return new lambda($this, func_get_args());
}
else {
$args = array_merge($this->args, func_get_args());
$r = call_user_func_array($this->f, array_splice($args, 0, $this->count));
return is_callable($r) ? call_user_func(new lambda($r, $args)) : $r;
}
}
}
function lambda($f)
{
return new lambda($f);
}

例子:
$add = lambda(function($a, $b) { 
return $a + $b;
});
$add1 = $add(1);
echo $add1(2); // 3

即使你可以这样做:
$int1 = lambda(function($f, $x) {
return $f($x);
});

$successor = lambda(function($p, $f, $x) {
return $f($p($f, $x));
});

$add = lambda(function($p, $q, $f, $x) {
return $p($f, $q($f, $x));
});

$mul = lambda(function($p, $q, $x) {
return $p($q($x));
});

$exp = lambda(function($m, $n) {
return $n($m);
});

$int2 = $successor($int1);
$int3 = $add($int1, $int2);
$int6 = $mul($int3, $int2);
$int8 = $exp($int2, $int3);

关于php - 是否可以在 PHP 中进行方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1609985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com