Статический массив в функции PHP не работает

PHP - тестирование простой функции со статической переменной массива. Я предполагаю, что статическая переменная, объявленная в функции, сделает ее доступной вне функции.

Эта функция просто принимает сообщение и добавляет его в массив errors [], а затем может использовать этот список ошибок [] вне функции.

Я получаю сообщение об ошибке: «Примечание: неопределенная переменная: ошибки в .... в строке 10»

Строка 10 содержит код «print_r ($ errors);»

function addErrors($errmessage){
    static $errors = array();
    $errors[] = $errmessage; 
}
addErrors('test1');
addErrors('test2');
print_r($errors);

Ваш вклад приветствуется!

static не меняет область видимости переменной; это просто означает он не теряет своего значения при выходе из функции. globalэто ключевое слово, которое вы ищете. Но глобальные переменные плохие, хорошо?
Matt Raines 29.04.2018 09:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 746
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Из документации:

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; 
}

Справка

  • Variable Scope
Ответ принят как подходящий

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

вот пример того, как добиться того, что вы пытаетесь сделать:

PHP 7 <:

<?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 7> =:

<?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; }}

HDer 29.04.2018 19:40

какую версию php вы используете? мой код является действительным кодом php 7.0, однако я собираюсь добавить еще один для php 5. *

Saif Eddin Gmati 29.04.2018 22:16

Я использую php 5.5.15 ... может поэтому выдает синтаксическую ошибку? Вы можете сказать мне, зачем нужен код "? Array"?

HDer 29.04.2018 22:36

Я настоятельно рекомендую вам перейти на php 7.2, он намного быстрее и потребляет гораздо меньше процессора и оперативной памяти, см .: secure.php.net/manual/en/migration70.php, secure.php.net/manual/en/migration71.php и secure.php.net/manual/en/migration72.php

Saif Eddin Gmati 29.04.2018 22:41

это означает, что функция возвращает либо null (?), либо array (массив)

Saif Eddin Gmati 29.04.2018 22:45

мне очень жаль, я не понимаю, как это случилось; _;

Saif Eddin Gmati 29.04.2018 22:45

Молодец, быстро реагирую. Я мог сказать, что там произошло, и что это не соответствует вашему нормальному уровню владения языком. ;-)

Yunnosch 29.04.2018 22:46

Вы определяете переменную $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());

Другие вопросы по теме