Я пытаюсь пройти через значения $_POST
и выполнить некоторые проверки/проверки и т.д. На следующем:
class Input
{
public function &Clean(&$source, $field = null)
{
$toClean = is_array($source) ? empty($field) ? $source : $source[$field] : $source;
//check if we are going to clean the whole array or only a specific field!
if (is_array($toClean)) {
//we foreach every key/field
foreach ($toClean as $to => $value)
$toClean[$to] = $this->DoClean($value);
} else {
$this->DoClean($toClean);
}
return $toClean;
}
private function DoClean(&$toClean)
{
return strip_tags(trim($toClean));
}
}
new Input()->Clean($_POST);
но это не работает, фактические значения $_POST
не изменились, что здесь отсутствует?
Вы, кажется, слегка неправильно понимаете концепцию ссылки или, по крайней мере, как ее использовать. Из документа PHP (акцент мой):
Вы можете передать переменную по ссылке на функцию, чтобы функция могла изменять переменную
Вы все равно должны изменить переменную внутри функции. И вам больше не нужно возвращать его, так как он изменен.
Самый простой пример - ваш метод DoClean
. Когда вы пишете его, ссылка бесполезна, потому что вы никогда не изменяете входное значение. Таким образом, следующая строго эквивалентна (с точки зрения ее действия) вашей функции:
private function DoClean($toClean)
{
return strip_tags(trim($toClean));
}
// use it as follows :
$toClean = $this->DoClean($toClean);
Однако, если вы хотите использовать ссылку, вы можете изменить входную переменную. Таким образом, вам больше не нужно возвращать значение, значение, которое вы передали функции, будет содержать результат после вызова. Например:
private function DoClean(&$toClean)
{
$toClean = strip_tags(trim($toClean));
}
// use it as follows
$this->DoClean($toClean);
Этот эффект на $toClean
будет одинаковым в обоих примерах.
Теперь, как указано аксиак, у вас такая же путаница в вашей функции Clean()
. Он использует как ссылку, так и return
, а в то время как $source
является ссылкой на $_POST
, $toClean
больше не существует. Все переменные, которые вы модифицируете, должны быть ссылками, чтобы иметь переменную $_POST
, если каким-то образом есть копия на промежуточном этапе, она сама будет изменена, но не исходная. Два решения:
$source
$source
$toClean
по ссылке. В этом случае вы не можете использовать тройную форму. Пытаться:if( !is_array($source) || empty($field) )
$toClean = &$source;
else
$toClean = &$source[$field];
После того, как вы сделаете что-то подобное, вы можете захотеть взглянуть на array_walk и array_walk_recursive, чтобы сделать общий код проще:
class Input
{
public function Clean(&$source, $field = null)
{
if( !is_array($source) || empty($field) )
$toClean = &$source;
else
$toClean = &$source[$field];
if (is_array($toClean)) {
array_walk($toClean, array($this, 'DoClean');
} else {
$this->DoClean($toClean);
}
}
private function DoClean(&$toClean)
{
$toClean = strip_tags(trim($toClean));
}
}
(new Input())->Clean($_POST);
Попробуйте этот код:
<?php
class Input
{
public function Clean(&$source, $field = null)
{
$toClean = is_array($source) ? empty($field) ? $source : $source[$field] : $source;
//check if we are going to clean the whole array or only a specific field!
if (is_array($toClean)) {
//we foreach every key/field
foreach ($toClean as $to => $value)
$toClean[$to] = $this->DoClean($value);
// CHANGE SOURCE ARRAY
$source = $toClean;
} else {
$this->DoClean($toClean);
}
return $toClean;
}
private function DoClean(&$toClean)
{
return strip_tags(trim($toClean));
}
}
(new Input())->Clean($_POST);
Ошибка: копирование source
массива
Вы передаете $_POST
ссылкой на метод Clean()
но вы не меняете его в методе.
Работайте над $source
(и отбрасывайте $toClean
) в функции Clean()
и он изменит значения в $_POST
(или любой массив, который вы передадите в Clean()
качестве аргумента, когда вы его вызываете).
shuffle
илиarray_shift
). Я думаю, чтоreturn
не нужно для этого метода. Но это должен решить автор. Я просто показываю местоположение ошибки