Мне нравится использовать массивы для функций, которые могут иметь много параметров.Такой подход допускает почти бесконечное расширение параметров и является более простым и лучшим, чем использование чего-то вроде func_get_args()
.
public function search(array $options = array())
{
$defaults = array(
'name' => null,
'age' => null,
'order' => null,
'limit' => null,
'offset' => null,
);
$options = array_merge($defaults, $options);
extract($options);
$select = $this->select();
if (!is_null($name)) {
$select->where('name = ?', $name);
}
if (!is_null($age)) {
$select->where('age = ?', $age, Zend_Db::INT_TYPE);
}
if (!is_null($order)) {
$select->order($order);
}
if (!is_null($limit) || !is_null($offset)) {
$select->limit($limit, $offset);
}
$results = $this->fetchAll($select);
return $results;
}
... или вы можете использовать объектно-ориентированный подход:
class SearchQuery
{
public function __construct(array $options = null)
{
if (!is_array($options)) {
return;
}
if (array_key_exists('name', $options)) {
$this->setName($options['name']);
}
if (array_key_exists('age', $options)) {
$this->setAge($options['age']);
}
}
public function setName($name)
{
if (!is_string($name)) {
throw InvalidArgumentException('$name must be a string');
}
$this->_name = $name;
return $this;
}
public function setAge($age)
{
if (!is_numeric($age) || $age <= 0) {
throw new InvalidArgumentException('$age must be a positive integer');
}
$this->_age = $age;
return $this;
}
}
// then you can use dependency injection in your main search class
class SearchService
{
public function search(SearchQuery $query)
{
// search
}
}