В чем причина не использовать класс в функции php

CLR использует выделенный поток, чтобы отслеживать активные таймеры System.Timers.Timer и System.Threading.Timer. Событие Elapsed поднимается на другой поток, вытащенный из потока.

Итак, да, они продолжают тикать, не затрагивая друг друга. Вы должны быть очень осторожны, вполне возможно, что ваш обработчик события Elapsed будет вызван снова, пока он все еще выполняется. Это происходит, когда это занимает больше времени, чем интервал. Или, что еще хуже, когда машина сильно загружена или у вас много активных потоков threadpool. Это может привести к очень тяжелой диагностике сбоя, если обработчик событий не является потокобезопасным. Это почти никогда не бывает. Установка свойства AutoReset таймера на значение false - это простой способ избежать этой проблемы.

0
задан CoderJoe 28 February 2019 в 18:34
поделиться

3 ответа

Объявление класса внутри функции, вероятно, является ошибкой.

Если внутри функции появляется объявление класса, класс определяется при вызове этой функции. Класс не будет доступен до вызова функции, и повторный вызов функции приведет к фатальной ошибке («Невозможно объявить класс…, поскольку имя уже используется»).

Поскольку шорткод Wordpress может вызываться несколько раз во время выполнения скрипта, объявление класса в обработчике шорткода может вызвать ошибки. Если вы хотите объявить класс, сделайте это на верхнем уровне файла.

0
ответ дан duskwuff 28 February 2019 в 18:34
поделиться

Шорткоды WordPress никогда не предназначались для вызова в контексте PHP. Они предназначены для использования в содержании . Возможность вызывать шорткод в PHP - это скорее деталь реализации, чем то, что вы обычно делаете.

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

Или вы можете использовать реальную классовую автозагрузку и $foo = new Foo(); будет работать без какого-либо дополнительного кода.

Так что никто этого не делает (или что-то в этом роде), потому что автозагрузка - это вещь, которая отлично работает.

0
ответ дан Rarst 28 February 2019 в 18:34
поделиться

Я понимаю, что объектно-ориентированное программирование находится на вершине уже более десятка лет, но WP использует совершенно другую парадигму: Структурное программирование . Поэтому постарайтесь не смешивать это.

А теперь для вашего случая:

Если вы используете автозагрузчик , то файлы с классами будут автоматически включены при первом использовании.

Кроме того, вы используете определения классов прямо из PHP4. В PHP5 были введены ключевые слова public, private, protected (для настройки видимости методов в классах).

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

function CreateFooClass(){
  if(!class_exists('Foo')) {
    class Foo{
      public function Bar(){
        return "FooBar";
      }
    }
  }
  return new Foo()
 }

$foo = CreateFooClass();
$foo->Bar();
0
ответ дан bato3 28 February 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: