Ищу предложения от архитекторов PHP!
Я не очень хорошо знаком с PHP, но взял на себя поддержку большого пакета аналитики, написанного на этом языке. Архитектура предназначена для считывания отчетных данных в большие массивы ключей и значений, которые передаются через различные модули синтаксического анализа для извлечения тех параметров отчета, которые известны каждому из этих модулей. Известные параметры удаляются из главного массива, а любые оставшиеся параметры, которые не были распознаны ни одним из модулей, сбрасываются в своего рода всеобъемлющий отчет, показывающий «неизвестные» точки данных.
Существует несколько различных методов, используемых для вызова этих модулей синтаксического анализатора, и я хотел бы знать, какие из них считаются "правильной" структурой PHP. Некоторые используют передачу по ссылке, другие — по значению, некоторые функции, некоторые объекты. Все они каким-то образом изменяют входной параметр.
Ниже приведен суперупрощенный пример:
#!/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(), является наиболее подходящим стилем?