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