Область действия переменных — Использование переменных из одной функции в другой

У меня возникли проблемы с использованием переменной, сгенерированной в одной функции, в качестве переменной во второй функции.

я получил Примечание: неопределенная переменная: параметр в функции проверки, в строке:

$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='';
}
}

0

Решение

Видя, как проблема исчезнет, ​​если вы «в соответствии» код в 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
);
}

Настроить это немного, чтобы лучше удовлетворить ваши потребности

1

Другие решения

Вы не можете просто использовать переменную внутри функции в другой функции. Ты должен вернуть переменная $parameter, Добавьте оператор возврата в конец splitRulesAndParameters и сохранить результат в переменной внутри validate ($parameter = $this->spli...).

0

У вас на самом деле есть две проблемы, потому что вы меняете &переменная правила внутри вашей функции, но вы передаете ее по ссылке. Поэтому после выполнения функции переменная $ 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);

0
По вопросам рекламы [email protected]