gpt4 book ai didi

php - 当像函数一样调用类实例时的魔术方法?

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

我想做的是创建一个 Comparable 类,类似于 .NET 中的 IComparable,这样您就可以像这样实例化它:

$cmp = new MultiArrayCompare(2);

然后您可以通过以下方式对数组进行排序:

usort($myArray, $cmp);

它会根据第二个索引对数组的数组进行排序。为此,我想 usort 会尝试像函数一样调用 $cmp,因此我必须以某种方式覆盖该行为。它看起来不像 __call 做我想做的事(想了一分钟它就像 Python 的 __call__ )。

如果这不可能……是否有另一种很好的方法来为这个问题创建一个通用的解决方案?您可以在何处创建用户定义的排序函数但为其传递一些值(在本例中为“2”)?


使用 __invoke 我能够创建这些类:

abstract class Comparable {
abstract function Compare($a, $b);

function __invoke($a, $b) {
return $this->Compare($a, $b);
}
}

class ArrayCompare extends Comparable {
private $key;

function __construct($key) {
$this->key = $key;
}

function Compare($a, $b) {
if($a[$this->key] == $b[$this->key]) return 0;
return $a[$this->key] < $b[$this->key] ? -1 : 1;
}
}

class ArrayCaseCompare extends Comparable {
private $key;

function __construct($key) {
$this->key = $key;
}

function Compare($a, $b) {
return strcasecmp($a[$this->key], $b[$this->key]);
}
}

我可以用它来对数组的数组进行排序:

$arr = array(
array(1,2,3),
array(2,3,4),
array(3,2,4),
)

usort($arr,new ArrayCompare(1));

最佳答案

您正在寻找__invoke:

The __invoke() method is called when a script tries to call an object as a function.

示例:

class SortAscending
{
public function __invoke($a, $b)
{
return $a - $b;
}
}

$numbers = array(4,7,2,3,9,1);
usort($numbers, new SortAscending);
print_r( $numbers );

输出(demo):

Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 7 [5] => 9 ) 

更简洁的替代方法是使用闭包。您的代码将只是:

$arr = array(
array(1,2,3),
array(2,3,4),
array(3,2,4),
);

$key = 1;
usort($arr, function($a, $b) use ($key) {
return $a[$key] - $b[$key];
});

或 - 可重用和可配置(demo):

$ArrayCompare = function ($index) {
return function($a, $b) use ($index) {
return $a[$index] - $b[$index];
};
};
usort($arr, $ArrayCompare(1));

除此之外,您基本上可以使用任何您想要的方法并在回调中指定方法:

usort($arr, array(new ArrayCompare(1), 'Compare'));

上面没有魔法也能达到同样的效果。查看chapter on callbacks其他选项。

关于php - 当像函数一样调用类实例时的魔术方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591453/

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