PHP-архитектура, а также пошаговые ссылки и пропускная способность

Поиск предложений от PHP-архитекторов!

Я не очень хорошо знаком с PHP, но взял на себя обслуживание большого пакета аналитики, написанного на этом языке. Архитектура предназначена для чтения сообщаемых данных в большие массивы ключей / значений, которые передаются через различные модули синтаксического анализа, чтобы извлекать эти параметры отчета, известные каждому из этих модулей. Известные параметры удаляются из главного массива, и любые остатки, которые не были распознаны ни одним из модулей, сбрасываются в виде отчета, в котором отображаются «неизвестные» точки данных.

Существует несколько различных методов, используемых для вызова этих модулей синтаксического анализатора, и я хотел бы знать, какие из них считаются «правильной» структурой PHP. Некоторые используют pass-by-reference, другие pass-by-value, некоторые – это функции, некоторые – объекты. Все они каким-то образом модифицируют входной параметр.

Приводится супер-упрощенный пример:

#!/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 указывает, что, поскольку она использует copy-on-write, не должно быть большой разницы в производительности между использованием указателей на vs прямое обращение объекта и повторное чтение возвращаемого значения. Я также предпочел бы использовать объектно-ориентированную структуру, но мне неудобно со скрытыми изменениями, внесенными в входной параметр конструктора.

Из трех вызывающих методов: ParserA (), parse_b () и parse_c (), которые, если они являются наиболее подходящим стилем?

Я не специалист по PHP, но из моего опыта, проходящего по значению, лучше. Таким образом, код не будет иметь побочных эффектов, и это означает, что будет легче понять и поддерживать и делать на нем всевозможные сумасшедшие вещи, например использовать его в качестве обратного вызова для функции map . Поэтому я все для parse_b чтобы делать что-то.

FYI: В PHP объекты всегда передаются по ссылке, независимо от того, что. Также, если у вас есть массив с объектами и скалярными значениями в нем, скалярные значения передаются по значению, а объекты по ссылке.

Как правило, в PHP не используйте ссылки, если только вам это не нужно. ссылки на PHP также не то, что большинство людей ожидают от них:

«Ссылки в PHP – это средство доступа к одному и тому же содержимому переменной разными именами. Они не похожи на указатели на C, а вместо этого они являются псевдонимами таблиц символов.

Смотри также: php.net: Какие ссылки

Короче говоря:
Правильный способ обработки этого PHP заключается в создании объекта, который передает переменные вокруг значения или манипулирует массивом с помощью массива array_map (array_map позволяет применить функцию обратного вызова к элементам массива).

Я бы проголосовал против предложенных методов в целом, но из них я думаю, что parse_b имеет лучшую идею.

Я думаю, что было бы лучше сконструировать оболочку массива данных в классе, который мог бы легко «вытащить» ключ из него. Итак, синтаксический анализатор выглядит так:

 class ParserA { private $a = null; public function __construct(My_Data_Class $data) { $this->a = $data->popValue("a"); } public function toString() { return $this->a; } } 

И пример реализации

 class My_Data_Class { protected $_data; public function __construct(array $data) { $this->_data = $data; } public function popValue($key) { if (isset($this->_data[$key])) { $value = $this->_data[$key]; unset($this->_data[$key]); return $value; } } } с class My_Data_Class { protected $_data; public function __construct(array $data) { $this->_data = $data; } public function popValue($key) { if (isset($this->_data[$key])) { $value = $this->_data[$key]; unset($this->_data[$key]); return $value; } } }