Это работает:
my $priv_func1 = sub {
my $self = shift; say 'func1';
};
sub public_sub {
my $self = shift;
$self->$priv_func1(@_);
}
Я знаю, что ассоциативный массив обычно используется для настройки вещей в PHP (он называется шаблоном магического контейнера и считается плохой практикой, кстати), но почему бы вам не вместо этого создать несколько классов валидаторов, каждый из которых может обрабатывать одно правило? Примерно так:
interface IValidator {
public function validate($value);
}
$validators[] = new StringLengthValidator(2, 10);
$validators[] = new NotNollValidator();
$validators[] = new UsernameDoesNotExistValidator();
Это имеет множество преимуществ по сравнению с реализацией с использованием массивов:
array ('reqiured' => true)
) РЕДАКТИРОВАТЬ :
Возможно, вас вдохновит Проверка Zend-Framework .
Итак, определите мастер:
class BaseValidator {
protected $msgs = array();
protected $params = array();
abstract function isValid($value);
public function __CONSTRUCT($_params) {
$this->params = $_params;
}
public function getMessages() {
// returns errors-messages
return $this->msgs;
}
}
А затем создайте свои собственные валидаторы:
class EmailValidator extends BaseValidator {
public function isValid($val=null) {
// if no value set use the params['value']
if ($val==null) {
$val = $this->params['value'];
}
// validate the value
if (strlen($val) < $this->params['maxlength']) {
$this->msgs[] = 'Length too short';
}
return count($this->msgs) > 0 ? false : true;
}
}
Наконец, ваш начальный массив может выглядеть примерно так:
$this->name = new EmailValidator(
array(
'maxlength' => 10,
'minlength' => 2,
'required' => true,
'value' => $namefromparameter,
),
),
);
проверка может быть выполнена следующим образом:
if ($this->name->isValid()) {
echo 'everything fine';
} else {
echo 'Error: '.implode('<br/>', $this->name->getMessages());
}
Поскольку используется объектно-ориентированный объект, было бы чище, если бы вы использовали классы для проверки свойств. Например,
class StringProperty
{
public $maxLength;
public $minlength;
public $required;
public $value;
function __construct($value,$maxLength,$minLength,$required)
{
$this->value = $value;
$this-> maxLength = $maxLength;
$this-> minLength = $minLength;
$this-> required = $required;
}
function isValidat()
{
// Check if it is valid
}
function getValidationErrorMessage()
{
}
}
$this->name = new StringProperty($namefromparameter,10,2,true);
if(!$this->name->isValid())
{
$validationMessage = $this->name-getValidationErrorMessage();
}
Использование класса имеет то преимущество, что внутри него инкапсулируется логика, которой нет у массива (в основном, структуры).