Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否使用函数返回_Php_Function - Fatal编程技术网

Php 是否使用函数返回

Php 是否使用函数返回,php,function,Php,Function,我有两段代码可以做同样的事情,但是通过不同的方法,哪一个更好,为什么呢?非常感谢。第一段代码处理函数handle()中的$arr,并且不返回值,因为它是通过引用传递的,所有的更改都发生在函数handle()中,所以它不需要返回任何值 第二个代码段从函数handle()返回值,并覆盖$arr[]中以前的值 一个不返回,另一个返回,我想知道哪种方法合适或更可取,最重要的是,为什么,谢谢!返回和不返回之间的选择 第二个代码是 片段A: class a { public function org

我有两段代码可以做同样的事情,但是通过不同的方法,哪一个更好,为什么呢?非常感谢。第一段代码处理函数handle()中的$arr,并且不返回值,因为它是通过引用传递的,所有的更改都发生在函数handle()中,所以它不需要返回任何值

第二个代码段从函数handle()返回值,并覆盖$arr[]中以前的值

一个不返回,另一个返回,我想知道哪种方法合适或更可取,最重要的是,为什么,谢谢!返回和不返回之间的选择

第二个代码是

片段A:

class a {
    public function org(){
        $arr = array(1=>1,2=>2,3=>3);
        foreach($arr as $k=>&$v){
            $this->handle($v);
        }
        print_r($arr);
    }
    public function handle(&$item){
        $item+=1;
    }

}
$b = new a();
$b->org();
片段B:

class a {
    public function org(){
    $arr = array(1=>1,2=>2,3=>3);
    foreach($arr as $k=>$v){
        $arr[$k] = $this->handle($v);
    }
    print_r($arr);
}
public function handle($item){
    return $item+=1;
}

}
$b = new a();
$b->org();
最好是:):

否则-我假设您的代码只是一个示例-我建议使用函数的返回值(SnippetB)而不是通过引用传递。这就是返回值的目的,如果示例没有那么简单,通过引用传递可能会产生意外的副作用。

一般来说 通过引用接受参数并在适当的位置修改参数的函数通常(但并非总是!)更有效。这是因为它们不需要消耗内存和CPU周期来复制参数——它们将对参数本身进行操作

处理参数并返回结果值而不修改原始值(转换器)的函数更灵活,使用更方便

公平地说,我还应该提到,如果一个函数想要报告一个可能的故障,那么变压器就很难做到这一点,因为它们已经返回了一个结果(另一方面,变种人可以自由地为此使用返回值)。然而,这种类型的错误检查在今天已不受欢迎,通常不推荐使用

例子 作为一个示例,让我们比较函数和。它们都在阵列上运行,但第一个是变异子,第二个是转换器。假设我们要计算通过每个节点传递数组的结果:

$count = count(array_unique($array)); // convenient one-liner

shuffle($array);
$count = count($array); // two statements necessary: shuffle cannot be chained
该示例是人为设计的,但如果
array\u unique
shuffle
是同一函数的不同实现,显然您更愿意在源代码中使用
array\u unique

现在,让我们通过比较
sort
的mutator和transformer版本的资源使用情况,来了解mutator如何比transformers更高效:

突变子:

$array = range(1, 10000);
shuffle($array);

sort($array);
$oneToTen = array_slice($array, 0, 10);
echo memory_get_peak_usage();

变压器:

function transformer_sort($array)
{
    sort($array);
    return $array;
}

$array = range(1, 10000);
shuffle($array);

$oneToTen = array_slice(transformer_sort($array), 0, 10);
echo memory_get_peak_usage();

正如您所见,mutator版本需要更少的内存才能达到相同的结果。但有一个折衷办法:代码不太方便,它“破坏”了我们最初的数据数组。如果我们需要保留初始数据,那么内存使用量将是相同的,消除了变异子的优势,留下了它的劣势

结论 我建议遵循这一经验法则:

编写函数时,始终将其作为转换器,而不是作为第一个变量 选择。

如果您有性能问题,并且可以通过分析 这些问题可以通过使用变异子来解决 用等效变压器代替变压器 突变子


最简单的就是hek2mgl所说的。但如果您只是想知道原因,那是因为您创建另一个函数不仅会增加正在使用的内存中的堆堆栈,而且需要额外的CPU步骤来调用该函数

此外,对于要返回值的函数,PHP必须创建一个临时变量来保存和返回值。因此,您本质上是临时复制内存中的数据


但老实说,除非你移动的数组长度超过百万,否则你不会看到太大的差别。我想说这两个函数在占用空间方面几乎相同

>P>第三个选择,牢记数组从不离开类:

class a {
    private $arr;

    public function __construct() {
        $this->arr = array(1=>1,2=>2,3=>3);
    }

    public function org() {
        $this->handle();
        print_r($this->arr);
    }

    public function handle() {
        foreach(array_keys($this->arr) as $k){
            $this->arr[$k]++;
        }
    }
}

如果数组是类的属性,则不需要按值或引用传递。

避免按引用传递,避免使用&,这被认为是一种不好的做法。您可以只返回第二个示例代码中的值

为什么??因为如果你有很多参考资料,那么更改另一个参考资料将很难跟踪发生了什么


请记住,默认情况下对象总是通过引用传递的。

询问编程风格的意见通常不适合这样做,因为不太可能达成共识。@hek2mgl:这是模糊的,因为问题非常广泛。如果你试着把它说得更具体一些,我可以找到一个(可能是罕见的)例子来证明你错了。在英语中找不到正确的单词。。再给我一次机会。。。之后我们可以删除这个注释:)只是想说,通过引用传递的性能优势实际上取决于实现细节。即使是经验丰富的PHP程序员在通过引用传递时也会遇到奇怪的性能问题。尤其是对于较大的数组或对象。。我通常不会使用引用传递来调整性能。请重新阅读所有内容。如果你能减轻第一段的重量,例如把它往下移,那将是一个很好的答案@hek2mgl:我已经完成了编辑,所以请提供关于当前版本的建议。抱歉给你添麻烦了。
class a {
    private $arr;

    public function __construct() {
        $this->arr = array(1=>1,2=>2,3=>3);
    }

    public function org() {
        $this->handle();
        print_r($this->arr);
    }

    public function handle() {
        foreach(array_keys($this->arr) as $k){
            $this->arr[$k]++;
        }
    }
}