PHP 架构以及按引用传递与按值传递

标签 php pass-by-reference

寻求PHP架构师的建议!

我对 PHP 不太熟悉,但已经接管了用该语言编写的大型分析包的维护工作。该架构旨在将报告数据读取到大型键/值数组中,这些数组通过各种解析模块传递以提取每个模块已知的报告参数。已知参数将从主数组中删除,任何模块无法识别的任何剩余参数都会转储到一种显示“未知”数据点的包罗万象的报告中。

有几种不同的方法被用来调用这些解析器模块,我想知道哪些(如果有的话)被认为是“正确的”PHP 结构。有些使用引用传递,有些使用值传递,有些是函数,有些是对象。它们都以某种方式修改输入参数。

一个 super 简化的示例如下:

#!/usr/bin/php
<?php

$values = Array("a"=>1, "b"=>2, "c"=>3, "d"=>4 );


class ParserA {
    private $a = null;
    public function __construct(&$myvalues) {
        $this->a = $myvalues["a"];
        unset($myvalues["a"]);
    }
    public function toString() { return $this->a; }
}

// pass-by-value
function parse_b($myvalues) {
    $b = $myvalues["b"];
    unset($myvalues["b"]);
    return Array($b, $myvalues);
}

// pass-by-reference
function parse_c(&$myvalues) {
    echo "c=".$myvalues["c"]."\n";
    unset($myvalues["c"]);
}

// Show beginning state
print_r($values);

// will echo "1" and remove "a" from $values
$a = new ParserA($values);
echo "a=".$a->toString()."\n";
print_r($values);

// w ill echo "2" and remove "b" from $values
list($b, $values) = parse_b($values);
echo "b=".$b."\n";
print_r($values);

// will echo "3" and remove "c" from $values
parse_c($values);
print_r($values);

?>

输出将是:

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [d] => 4
)
a=1
Array
(
    [b] => 2
    [c] => 3
    [d] => 4
)
b=2
Array
(
    [c] => 3
    [d] => 4
)
c=3
Array
(
    [d] => 4
)

我真的很不舒服有这么多不同的调用方法在使用,其中一些使用“&pointer”风格的函数对调用函数参数有隐藏的影响,一些需要主体编写它们的输出,还有一些编写它们的独立输出。

我更愿意选择一种方法并坚持下去。为了做到这一点,我还想知道哪个最有效;我对 PHP 文档的阅读表明,由于它使用写时复制,因此使用指针与直接传递对象并重新读取返回值之间应该没有太大的性能差异。我也更喜欢使用面向对象的结构,但对构造函数上的输入参数进行隐藏更改感到不舒服。

在 ParserA()、parse_b() 和 parse_c() 这三种调用方法中,哪种风格最合适?

最佳答案

我并不是真正的 PHP 专家,但根据我的经验,按值传递更好。这样代码就不会产生副作用,这意味着它将更容易理解和维护,并可以在上面做各种疯狂的事情,比如使用它作为 map 函数的回调。所以我完全支持 parse_b 的做事方式。

关于PHP 架构以及按引用传递与按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1392987/

相关文章:

c# - 将列表传递给方法而不修改原始列表

php - 何时在 PHP 中传递引用

c++ - 按值或 const 引用传递函数?

c++ - 当您只需要这些参数之一时,使用通过引用传递的不同参数调用函数的最佳方法

现场 PHP session 问题但不是本地问题

javascript - 为什么谷歌地图不显示在我的网站上,我一直在使用开发者网站?

php - Yii2:如何更改/添加响应 header ?

Javascript - 原始类型与引用类型

php - 更新选项在 PHP 的购物车中不起作用

php - 如何比较 int 和 timestamp 列(La​​ravel Eloquent )?