В чем причина не использовать класс в функции php - PullRequest
0 голосов
/ 28 февраля 2019

Я просматривал этот вопрос PHP - определение классов внутри функции (Как у него так много голосов, вне меня)

Короче говоря, он не отвечает на мой вопрос.

Говоря конкретно, код с созданием плагинов WordPress

Шорткод - это то, что вы можете использовать в любом плагине, когда-то созданном, например

//Create callback for shortcode
function DisplayNumberFive(){
  echo "5";
}

//create shortcode as [DNF]
add_shortcode('DNF','DisplayNumberFive');

Теперь везде, где я хотел отобразить число 5 Я могу просто сделать

do_shortcode("[DNF]");

, и результат будет 5

Теперь, с учетом этой функциональности, имеет ли смысл иметь класс, например

//Create callback for shortcode
 function CreateFooClass(){
  class Foo{
    function Bar(){
      return "FooBar";
    }
  }
 }

 //Create shortcode as [include_Foo]
 add_shortcode('include_foo','CreateFooClass');

 //Use case
 do_shortcode("[include_foo]");

 $foo = new Foo();

 echo $foo->Bar();

 //Ouput
 "FooBar"

У меня вопрос, если я делаю это неправильно или это приводит к ошибкам, которых я не вижу.Будет ли Bar() даже доступен, поскольку он находится внутри функции?

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

Так почему никто этого не делает?

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

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

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

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

0 голосов
/ 28 февраля 2019

Я понимаю, что Объектно-ориентированное программирование находится на вершине уже более десятка лет, но 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 голосов
/ 28 февраля 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...