У меня возникли проблемы с использованием переменной, сгенерированной в одной функции, в качестве переменной во второй функции.
я получил Примечание: неопределенная переменная: параметр в функции проверки, в строке:
$this->$methodName($item,$value,$parameter) OR $valid=false;
Когда функция вызывает splitRulesAndParameters просто заменяется кодом внутри функции, проблема исчезает.
Следующие две функции находятся в классе Validator, первая, утверждать, использует второе, splitRulesAndParameters
Вот функция проверки:
public function validate($data, $rules)
{
$valid= true;
foreach($rules as $item=>$ruleSet)
{
$ruleSetArray=explode('|',$ruleSet);
foreach($ruleSetArray as $rule)
{
$this->splitRulesAndParameters($rule);
$methodName='validate'.ucfirst($rule);
$value = isset($data[$item]) ? $data[$item] : NULL;
if(method_exists($this, $methodName))
{
$this->$methodName($item,$value,$parameter) OR $valid=false;
}
}
}
return $valid;
}
А вот и функция splitRulesAndParameters.
public function splitRulesAndParameters($rule)
{
$position = strpos($rule, ':');
if($position !==false)
{
$parameter = substr($rule,$position + 1);
$rule = substr($rule,0,$position);
}
else
{
$parameter='';
}
}
Видя, как проблема исчезнет, если вы «в соответствии» код в splitRulesAndParameters
Подозреваю $parameters
переменная используется в этом методе. Если это так, просто есть этот метод вернуть значение этой переменной, и назначить его переменной, локальной для validate
метод вы разместили здесь:
$parameters = $this->splitRulesAndParameters($rule);
После добавления этого к splitRulsAndParameters
метод:
return $parameters;
Сам метод также изменяет $rule
значение. Опять же: это $rule
переменная является локальной для каждого метода. Может иметь то же имя, но значение является копией. Любые изменения, которые вы вносите в $rule
в splitRulesAndParameters
не отражается $rule
в вашем validate
метод. На твоем месте я бы написал:
public function splitRulesAndParameters($rule)
{
$position = strpos($rule, ':');
if($position !==false)
{
return array(
'parameter' => substr($rule, $position+1),
'rule' => substr($rule, 0, $position)
);
}
return array(
'parameter' => null,//no param == null, IMO, change to '' if you want
'rule' => $rule
);
}
Затем, чтобы изменить переменные в validate
:
$split = $this->splitRulesAndParameters($rule);
$rule = $split['rule'];
$parameter = $split['parameter'];
Это должно сделать это.
Примечание:
Вы, кажется, проверяете все это требует проверки, даже если первая проверка не удалась. Если бы я был тобой, я бы изменил это глупое утверждение:
$this->$methodName($item,$value,$parameter) OR $valid=false;
Для более эффективного:
if (!$this->{$methodName}($item, $value, $parameter))
return false;//if validation fails, return false
Это останавливает выполнение дальнейшей оценки: если одно значение недопустимо, просто остановитесь на этом. Продолжать бессмысленно, потому что набор данных в любом случае не совсем корректен.
Бонус:
Использование двоеточия для разделения имени метода, а некоторые параметры позволяют также указать несколько параметров и упростить splitRulesAndParameters
еще немного:
protected function splitRulesAndParameters($rule)
{
$all = explode(':', $rule);
return array(
'rule' => array_shift($all),//removes first element in array
'params' => $all//rest of the array
);
}
Настроить это немного, чтобы лучше удовлетворить ваши потребности
Вы не можете просто использовать переменную внутри функции в другой функции. Ты должен вернуть переменная $parameter
, Добавьте оператор возврата в конец splitRulesAndParameters
и сохранить результат в переменной внутри validate
($parameter = $this->spli...
).
У вас на самом деле есть две проблемы, потому что вы меняете &переменная правила внутри вашей функции, но вы передаете ее по ссылке. Поэтому после выполнения функции переменная $ rule остается такой же, как и раньше.
Чтобы решить эту проблему так, как вы это делаете прямо сейчас, можно изменить функцию на:
public function splitRulesAndParameters(&$rule)
{
$position = strpos($rule, ':');
if($position !==false)
{
$parameter = substr($rule,$position + 1);
$rule = substr($rule,0,$position);
}
else
{
$parameter='';
}
return $parameter;
}
и изменить линию
$this->splitRulesAndParameters($rule);
в
$ parameter = $ this-> splitRulesAndParameters ($ rule);