Могу ли я объявить пользовательскую функцию в разделе кода?

#php #octobercms

#php #octobercms

Вопрос:

Я пытаюсь объявить и вызвать функцию в php разделе частичного кода, но october ее не видит. Вот как выглядит код:

 function onStart() {
    return sayHi();
}

function sayHi() {
    return 'Hi';
}
  

Не могли бы вы сказать мне, что в этом плохого?
Разрешены ли здесь только те функции, которые относятся к жизненному циклу страницы? (OnStart(), onEnd(), OnInit(), OnRun() .. и т.д.)

Комментарии:

1. Вы прошли через это octobercms.com/docs/cms/partials ?

Ответ №1:

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

ОШИБКА: вызов неопределенной функции SayHi()

Причина этой ошибки здесь в том, что функции в разделе кода шаблона определены не в глобальной области видимости, а как методы некоторого объекта. Таким образом, чтобы ссылаться друг на друга, вам пришлось бы предварять каждый вызов перекрестной функции внутри раздела $this-> , чтобы указать, что вы вызываете метод текущего объекта, а не глобальную функцию.

Изменение вашей ònStart() функции на

 function onStart() {
    return $this->sayHi();
}
  

должно заставить ее работать.

Тем не менее, вы можете подумать о том, чего вы хотите достичь с помощью этого оператора return. При том, как разработаны OnStart() и другие функции жизненного цикла в October, оператор return обычно не ожидается. Но если она существует, цикл выполнения страницы в этот момент останавливается, и возвращаемое значение просто отправляется в качестве ответа обратно в браузер.

Если вы просто хотите отобразить сообщение «Привет» на странице (и перед всем остальным), то, возможно, вам лучше сделать это следующим образом:

 function onStart()
{
    $this->sayHi();
}

function sayHi()
{
    echo "<h1>Hi!</h1>";
}
  

так что цикл рендеринга страницы все еще продолжается после этого. Но на самом деле это все равно было бы бесполезно, потому что "<h1>Hi!</h1>" теперь выводится перед всем остальным (то есть перед открывающим <html> тегом или чем-то еще, что находится вверху).

Я предполагаю, что на самом деле вы не хотели использовать ее таким образом, кроме как в целях тестирования функциональности, но в любом случае, подумал, что было бы неплохо объяснить, чтобы люди получили представление о том, что на самом деле там происходит, если они наткнутся на это. 😉

(В связи с этим, вот некоторая документация о правильном использовании для отправки пользовательского ответа в OctoberCMS.)


(Если вы хотите создать специальное сообщество stackechange для OctoberCMS, пожалуйста, поддержите предложение octobercms.stackexchange. Я удалю это раздражающее сообщение, как только эта цель будет достигнута — обещаю 🙂 )

Комментарии:

1. Большое тебе спасибо, троллкотце, ты спас мой день! И да, вы правы, я хотел функциональность 🙂

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

3. Кроме того, если вы еще не сделали этого, пожалуйста, поддержите предложение о выделенном разделе OctoberCMS stackexchange здесь . Как только мы получим по крайней мере 200 пользователей, согласившихся поддержать это, и некоторые с достаточной репутацией в других местах, предложение будет принято. Итак, ваш небольшой вклад мог бы помочь всем нам получить лучшее централизованное место для создания базы знаний OctoberCMS Q amp; A на этой замечательной платформе stackexchange. 🙂

Ответ №2:

попробуйте:

 function sayHi() {
    return 'Hi';
   }

function onStart() {
    return sayHi();
   }
  

в противном случае, когда выполнение достигнет, return sayHi(); оно не будет знать функцию sayHi() . немного литературы об этом …

Комментарии:

1. единственная причина, по которой функция не распознает другую, заключается в том, что она объявляется и вызывается из точки в коде, где другая не объявлена, поэтому я считаю, что ваша проблема зависит от того, как организован ваш код и в каком порядке «компилируются» ваши файлы…