在课堂上使用函数

Mar*_*nus 49 php

我有一个函数可以在多维数组中对数据进行排序,如下所示:

<?php  
$data = array();  
$data[] = array("name" => "James");  
$data[] = array("name" => "andrew");  
$data[] = array("name" => "Fred");  

function cmp($a, $b)  
{  
    return strcasecmp($a["name"], $b["name"]);  
}  

usort($data, "cmp");  

var_dump($data);  
?>  
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它按预期工作,返回按名称排序的数据,升序.但是,我需要在课堂上使用它.

<?php
class myClass  
{  
    function getData()  
    {  
        // gets all data
        $this -> changeOrder($data);
    }  

    function changeOrder(&$data)  
    {  
         usort($data, "order_new");
    }

    function order_new($a, $b)  
    {  
        return strcasecmp($a["name"], $b["name"]);  
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

当我使用它时,我收到以下警告:警告:usort()期望参数2是有效的回调,找不到函数'order_new'或函数名无效.

当我把order_new函数放在changeOrder函数中它工作正常,但我有致命错误的问题:无法重新声明order_new(),所以我不能使用它.有什么建议?

wor*_*nga 103

order_new是一个类方法而不是全局函数.正如PHP-Manual建议你可以在这种情况下使用

usort($data, array($this, "order_new")); 
Run Code Online (Sandbox Code Playgroud)

或声明order_new静态并使用

usort($data, array("myClass", "order_new")); 
Run Code Online (Sandbox Code Playgroud)

  • `usort($ data,array("MyBundle\PathTo\MyClass","orderNew"));`如果你正在使用命名空间 (16认同)

xda*_*azz 9

改成 usort($data, array($this, "order_new"));


Har*_*hof 5

 usort($data, array($this,"order_new"));
Run Code Online (Sandbox Code Playgroud)

是你在引用类实例中的函数时想要的.见可赎回

实例化对象的方法作为包含索引0处的对象和索引1处的方法名称的数组传递.


bel*_*zar 5

需要考虑的一件事是,如果变量通过引用传递给您的方法,则 usort() 似乎是在引用变量的上下文中执行,而不是在您当前的方法中执行。因此,您需要在类引用中提供完整的命名空间,如下所示:

usort($data, ['My\NameSpace\MyClass', 'order_new']); 
Run Code Online (Sandbox Code Playgroud)

  • 有趣的。它按原样在我的项目中工作,但带有单引号。我已经更新以反映这一点。 (2认同)