2017-01-29 3 views
0

У меня есть сценарий с 3 (соответствующими) глобальными переменными, используемыми для отслеживания ошибок, которые происходят во время проверки пользовательских данных. Функция, которая обрабатывает их выглядит следующим образом:Глобальные переменные, получающие сброс в PHP

$errors = ''; 
$errorNo = 0; 
$erred = false; 

function addError($errorMessage) { 
    global $errors, $errorNo, $erred; 
    if (!$erred) { 
     $erred = true; 
    } 
    $errorNo++; 
    $errors .= $errorNo . ". " . $errorMessage; 
} 

Предположим, я называю более addError(), чем когда-то, $errors будет иметь значение '', даже если это просто модифицированный функцией addError(). Не только это, но и переменные $errorNo и $erred также сбрасываются до значений, с которых я их сначала инициализировал.

Я тщательно проверил свой код, чтобы узнать, были ли изменены $error или другие переменные в другом месте, но безрезультатно.

Теперь это было еще странно. Чтобы убедиться, что они не были изменены ничем другим (у меня есть внешняя библиотека, импортированная с использованием require()), я создал класс под названием errorHandler.

class errorHandler { 
    private $errorCount = 0; 
    private $erred = false; 
    private $errors = ''; 

    public function addError($errorMessage) { 
     $this->erred = true; 
     $this->errorCount++; 
     $this->errors .= $this->errorCount . ". " . $errorMessage; 
    } 

    public function getErrors() { 
     return $this->errors; 
    } 
} 

Значения $errors, $errorCount и $erred не хранится после того, как функция заканчивается. Если я повторяю значение внутри функции, это будет только что присвоенное ему значение, однако, если я повторю его перед назначением, это будет значение, которое оно имело, когда оно было инициализировано.

Любые идеи, в которых может возникнуть проблема? Благодарю.

EDIT:

errorHandler класс используется следующим образом:

$errorHandler = new errorHandler; // Earlier in code 

function addError($errorMessage) { // Function has name to avoid renaming 
    global $errorHandler; 
    $errorHandler->addError($errorMessage); 
} 
+1

Можете ли вы поделиться примером того, какой класс используется? (с вашей отладкой) –

+0

Если вы имеете в виду внешнюю библиотеку: http: //getid3.sourceforge.net/ –

+0

Я имею в виду использование функции «errorHandler», которую вы написали. –

ответ

0

Проблема оказалась не, что переменные получали сброс (как вы могли бы ожидать), но, это ошибка, которую можно узнать для других, которых я надеюсь.

В основном я имел функцию checkLength() в если заявление так:

if (checkLength($stringOne) && checkLength($stringTwo) && checkLength($stringThree)) { 

Заявление checkLength бы проверить длину строки и возвращать ложь, если она была слишком короткой или слишком долго, но до того, что бы добавить ошибку, используя addError() функцию:

function checkLength($string) { 
    if (.. 
    .. 
    else { 
     addError("Too short/long"); 
     return false; 
    } 
} 

То, что я не понимал, что как только, если оператор имеет один ложное значение (так как у меня было & Оператор &) было бы не выполнить checkLength на второй или третьей строке, следовательно, не добавляя ошибку, заставив меня поверить, что регистрировалась только одна из ошибок.

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

+0

Вот почему вас попросили ввести код, а не описывать его. – shudder

Смежные вопросы