我试图使用usort
调用一个函数,但是,我得到一个错误,该类没有方法。
$awards = usort ($q->posts, array($this, '_mt_latest_award_sort'));
当前设置为:
namespace Test'Theme
class Shortcodes extends Theme
{
// ...
// this is the function I am trying to call on
function _mt_latest_award_sort($value1, $value2)
{
// ...
// code to do the sorting
// ...
}
// ...
$awards = usort ($q->posts, array($this, '_mt_latest_award_sort');
// ...
}
当我改变CCD_ 2以引用我的";奖励";功能
$awards = usort ($q->posts, array($this, 'awards'));
它返回了一个错误,即我在publicawards函数中的函数已经声明。
如何正确指向_mt_latest_award_sort
函数?
您的函数在另一个函数中,请尝试在类中声明您的函数,而不是
例如:
class C
{
public function Fa()
{
function Fc()
{
...
}
...
$this->Fb(); // it works C::Fb is a function
$this->Fc(); // it doesn't work, there is no C::Fc function
...
}
function Fb()
{
...
}
}
PHP不支持嵌套函数。
这是一个常见的错误/误解,因为下面的代码似乎有效:
function foo() {
function bar() {
echo 'Hello!';
}
bar();
bar();
bar();
}
然而,这实际上并不是定义嵌套函数,它只是在运行foo()
时定义全局函数bar
。您可以通过运行两次foo()
来测试这一点——第一次,将定义function bar
,然后运行3次;第二次,你会得到一个致命的错误,因为你试图定义同一个函数两次。
您要么需要将函数定义为类的一个单独方法:
class Shortcodes extends Theme
{
public function awards()
{
...
$awards = usort($q->posts, array($this, '_mt_latest_award_sort'));
...
}
private function _mt_latest_award_sort($value1, $value2)
{
...
//code to do the sorting
...
}
}
或者,使用匿名函数:
class Shortcodes extends Theme
{
public function awards()
{
...
$awards = usort ($q->posts, function($value1, $value2)
{
...
//code to do the sorting
...
});
...
}
}
当调用方法"awards"时,会尝试声明函数"_mt_latest_award_sort"。
对于$awards = usort ($q->posts, array($this, '_mt_latest_award_sort');
的实现,这也会以同样的方式失败:
$shortcode = new Shorcodes;
$shortcode->awards(); // "_mt_latest_award_sort" is declared
$shortcode->awards(); // attempted to redeclare "_mt_latest_award_sort"
仅仅因为您在另一个函数中声明了一个命名函数,并不意味着它的作用域不是全局的。
这应该可以解决您的问题:
class Shortcodes extends Theme
{
private $posts = array();
// ...
private function _mt_latest_award_sort($value1, $value2) {
// ...
}
public function awards()
{
// ...
$awards = usort($this->posts, array($this, '_mt_latest_award_sort'));
// ...
}
}
你也可以使用匿名函数:
$awards = usort($this->posts, function($value1, $value2) {
// ...
});