редактирование $ _POST с использованием ссылки

0

Я пытаюсь пройти через значения $_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 не изменились, что здесь отсутствует?

Теги:

3 ответа

0
Лучший ответ

Вы, кажется, слегка неправильно понимаете концепцию ссылки или, по крайней мере, как ее использовать. Из документа 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);
0

Попробуйте этот код:

<?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 массива

  • 0
    @Cimbali Хм, а почему?
  • 0
    @ Cimbali Как я понимаю этот код, автор хочет изменить каждое значение, которое будет передано по ссылке в этой функции (например, методы shuffle или array_shift ). Я думаю, что return не нужно для этого метода. Но это должен решить автор. Я просто показываю местоположение ошибки
Показать ещё 2 комментария
0

Вы передаете $_POST ссылкой на метод Clean() но вы не меняете его в методе.

Работайте над $source (и отбрасывайте $toClean) в функции Clean() и он изменит значения в $_POST (или любой массив, который вы передадите в Clean() качестве аргумента, когда вы его вызываете).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню