PHP - тестирование простой функции со статической переменной массива. Я предполагаю, что статическая переменная, объявленная в функции, сделает ее доступной вне функции.
Эта функция просто принимает сообщение и добавляет его в массив errors [], а затем может использовать этот список ошибок [] вне функции.
Я получаю сообщение об ошибке: «Примечание: неопределенная переменная: ошибки в .... в строке 10»
Строка 10 содержит код «print_r ($ errors);»
function addErrors($errmessage){
static $errors = array();
$errors[] = $errmessage;
}
addErrors('test1');
addErrors('test2');
print_r($errors);
Ваш вклад приветствуется!






Из документации:
A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.
Чтобы сделать переменную доступной за пределами области действия функции, вы можете вместо этого использовать ключевое слово global:
function addErrors($errmessage){
global $errors;
$errors[] = $errmessage;
}
Справка
$errors - это статическая переменная внутри функции, вы не можете получить к ней доступ из глобальной области видимости.
вот пример того, как добиться того, что вы пытаетесь сделать:
<?php
/**
* @param string|null the error message to add or null
* @return array|null returns all errors if provided with null
*/
function errors($error = null) {
static $errors = [];
if ($error !== null) {
$errors[] = $error;
return null;
} else {
return $errors;
}
}
errors('Error !');
errors('Another !');
print_r(errors());
<?php
function errors(string $error = null): ?array {
static $errors = [];
if ($error !== null) {
$errors[] = $error;
return null;
} else {
return $errors;
}
}
errors('Error !');
errors('Another !');
print_r(errors());
Спасибо! Однако в вашем примере кода возникает синтаксическая ошибка: "неожиданно ':', ожидая '{' в ...". Но когда я его немного изменяю, все работает нормально: ошибки функции ($ error = null) {static $ errors = []; если ($ error! == null) {$ errors [] = $ error; return null; } else {return $ errors; }}
какую версию php вы используете? мой код является действительным кодом php 7.0, однако я собираюсь добавить еще один для php 5. *
Я использую php 5.5.15 ... может поэтому выдает синтаксическую ошибку? Вы можете сказать мне, зачем нужен код "? Array"?
Я настоятельно рекомендую вам перейти на php 7.2, он намного быстрее и потребляет гораздо меньше процессора и оперативной памяти, см .: secure.php.net/manual/en/migration70.php, secure.php.net/manual/en/migration71.php и secure.php.net/manual/en/migration72.php
это означает, что функция возвращает либо null (?), либо array (массив)
мне очень жаль, я не понимаю, как это случилось; _;
Молодец, быстро реагирую. Я мог сказать, что там произошло, и что это не соответствует вашему нормальному уровню владения языком. ;-)
Вы определяете переменную $errors внутри области действия функции, вне области видимости она не будет существовать.
Статический означает только то, что в этом случае он будет создан один раз, а не то, что он доступен за пределами области действия, ключевое слово global может вам помочь, но, честно говоря, я бы порекомендовал другой подход (глобальный - плохая практика).
Вы можете вернуть массив ошибок из метода:
function addErrors($err) {
static $errors = [];
$errors[] = $err;
return $errors;
}
Лучшим способом, вероятно, было бы создать класс:
class ErrorHandler {
private static $errors = [];
public static function addError($error) {
self::$errors[] = $error;
}
public static function getErrors() {
return self::$errors;
}
}
Затем используйте его как:
ErrorHandler::addError('error');
print_r(ErrorHandler::getErrors());
staticне меняет область видимости переменной; это просто означает он не теряет своего значения при выходе из функции.globalэто ключевое слово, которое вы ищете. Но глобальные переменные плохие, хорошо?