Как вызвать функцию из другого файла php
Fabien 17 фев 2014, 10:55
Добрый день всем!,
Вопрос:
Как вызвать функцию из совершенного другого скрипта?(оба файла js)
Делаю вот так:
Синтаксис:
Синтаксис: [ Показать ]
Используется javascript
var script = gameObject. GetComponent ( «game» ) ;
script. PlayNextSong ( ) ;
Выдает сразу же ошибку в консоли
Синтаксис:
Синтаксис: [ Показать ]
Используется javascript
Assets / scripts / scores. js ( 95 , 32 ) : BCE0019 : ‘PlayNextSong’ is not a member of ‘UnityEngine.Component’ .
Подскажите как можно реализовать? гуглил гугли нашел только на C#(нефига не понял)
Так же читал: https://docs.unity3d.com/Documentation/ . onent.html
Вроде сделал так же как там написано и не робит.
Помогите
Fabien UNец Сообщения: 29 Зарегистрирован: 04 июл 2013, 10:44
Re: Вызов функции из другого скрипта
seaman 17 фев 2014, 11:24
1. Что возвращает GetComponent? Он возвращает Component!
2. Есть ли в Component ваша функция? Естественно нет!
3. Где она есть? Она есть в Вашем скрипте!
4. Что надо сделать? Привести тип к Вашему!
PS: Изучайте программирование! Для начала — что такое тип, что такое приведение типов.
seaman Адепт Сообщения: 8352 Зарегистрирован: 24 янв 2011, 12:32 Откуда: Самара
Re: Вызов функции из другого скрипта
Fabien 17 фев 2014, 11:32
seaman писал(а): 1. Что возвращает GetComponent? Он возвращает Component!
2. Есть ли в Component ваша функция? Естественно нет!
3. Где она есть? Она есть в Вашем скрипте!
4. Что надо сделать? Привести тип к Вашему!
PS: Изучайте программирование! Для начала — что такое тип, что такое приведение типов.
Спасибо вы мне очень помогли!
Fabien UNец Сообщения: 29 Зарегистрирован: 04 июл 2013, 10:44
Re: Вызов функции из другого скрипта
hetr 31 янв 2015, 22:34
do_action() │ WP 1.2.0
Создает событие (возможность запустить php функции в нужный момент работы кода). Подключать php функцию к событию нужно с помощью add_action().
Смотрите также аналогичную функцию: do_action_ref_array().
ВАЖНО: Если не передать ни один параметр в хук, то функция хука все равно получит один параметр со значением » (пустая строка).
add_action( 'action_name', function( $first ) < var_dump( $first ); >); do_action( 'action_name' ); // выведет> string(0) ""
Не передавайте массив с одним объектом
При вызове do_action, если переданный $arg является массивом с одним объектом, то вместо него будет передан именно этот объект, а не массив. Однако, если единственный элемент массива не является объектом, такой подмены не произойдет. Пример:
function my_callback( $should_be_an_array ) < print_r( $should_be_an_array ); >add_action( 'my_action', 'my_callback' ); do_action( 'my_action', array( new stdclass() ) ); /* stdClass Object() */ do_action( 'my_action', array( 'array_item_thats_not_an_object') ); /* Array ( [0] => array_item_thats_not_an_object ) */
Обратите внимание, что в первый раз мы передали массив с классом stdclass, но функция обратного вызова получила только класс stdclass, а не массив!
Кроме событий в WP также есть фильтры — apply_filters(). Принцип работы у них такой же — создаем фильтр и прикрепляем к нему php функцию которая сработает во время работы фильтра. Разница между фильтрами и событиями в том, что фильтр получает какие-то данные и должен вернуть эти данные после их обработки, т.е. он фильтрует (изменяет) данные, а событие только лишь запускает прикрепленные к нему функции в нужный момент, передав в них какие-либо параметры.
Основа для: wp_footer() , wp_head()
1 раз — 0.00007 сек (очень быстро) | 50000 раз — 0.03 сек (скорость света)
Возвращает
null . Ничего не возвращает.
Использование
do_action( $tag, $arg_a, $arg_b, . );
$tag(строка) (обязательный) Название создаваемого хука. $arg_a(строка/массив/число/объект/логический) Значение аргумента, который будет передан.
По умолчанию: аргумент не существует $arg_b(строка/массив/число/объект/логический) Значение еще одного аргумента.
По умолчанию: аргумент не существует $arg_с(строка/массив/число/объект/логический) Функции можно передавать бесконечно много аргументов.
Примеры
#1 Пример использования
Эту функцию можно использовать в плагинах, темах и т.д., когда нужно внедрится в процесс выполнения кода, откуда-нибудь из другого места. Например, «зацепку» (хук) (do_action) мы установили в плагине, а «цепляться» за нее будем из файла functions.php в тот момент, когда будет срабатывать наша «зацепка». Допустим, мы использовали такой код в плагине:
Теперь мы может сделать какое-нибудь действие в момент срабатывания функции do_action и при этом описать наше действие можно, например, из файла functions.php, разместив в нем такой код:
function do_my_hook( $a, $b )< // если переданная переменная $a равна true, // то, например, удалим запись 10 if( $a===true ) wp_delete_post(10); // а тут просто выведем переменную на экран echo '
'.$b; // выведет значение второй переменной > // Регистрируем хук через // add_action( $tag, $function_to_add, $priority, $accepted_args ); add_action( 'my_hook', 'do_my_hook', 10, 2 );
Действия отличаются от фильтров, тем что передаваемые действием данные, не возвращаются обратно в функцию и не используются там в дальнейшем, а всего-лишь передаются для использования в функции хука.
#2 Пример использования 2
Где-то в (mu-)плагине, теме или ядре. Например, в файле functions.php:
/** * У вас может быть столько аргументов, сколько вы хотите, * но ваша функция обратного вызова и вызов add_action должны быть согласованы по количеству аргументов. * Примечание: `add_action` выше имеет 2, а 'i_am_hook' принимает 2. * Вы найдете подобные хуки действий во многих темах и плагинах и во многих местах @core. * @see: https://codex.wordpress.org/Plugin_API/Action_Reference */ /** * Определяем функцию обратного вызова * Внутри этой функции вы можете делать все, что вам вздумается. * с переменными, которые загружены в вызове do_action() выше. */ function who_is_hook( $a, $b ) < print_r( $a ); // `print_r` данные массива внутри 1-го аргумента echo $b; // выводим символ перевода строки и значение 2-го аргумента >// затем добавить его в хук действия, сопоставив определенное количество (2) аргументов в do_action // см. [https://codex.wordpress.org/Function_Reference/add_action] в Кодексе // add_action( $tag, $function_to_add, $priority, $accepted_args ); add_action( 'i_am_hook', 'who_is_hook', 10, 2 ); // Define the arguments for the action hook $a = array( 'eye patch' => 'yes', 'parrot' => true, 'wooden leg' => 1 ); $b = 'And Hook said: "I ate ice cream with Peter Pan."'; // Executes the action hook named 'i_am_hook' do_action( 'i_am_hook', $a, $b );
Array ( ['eye patch'] => 'yes' ['parrot'] => true ['wooden leg'] => 1 ) And hook said: "I ate ice cream with Peter Pan."
Добавить свой пример
Заметки
- Global. WP_Hook[]. $wp_filter Stores all of the filters and actions.
- Global. int[]. $wp_actions Stores the number of times each action was triggered.
- Global. Строка[]. $wp_current_filter Stores the list of current filters with the current one last.
Список изменений
| С версии 1.2.0 | Введена. |
| С версии 5.3.0 | Formalized the existing and already documented . $arg parameter by adding it to the function signature. |
Код do_action() do action WP 6.4.1
function do_action( $hook_name, . $arg ) < global $wp_filter, $wp_actions, $wp_current_filter; if ( ! isset( $wp_actions[ $hook_name ] ) ) < $wp_actions[ $hook_name ] = 1; >else < ++$wp_actions[ $hook_name ]; >// Do 'all' actions first. if ( isset( $wp_filter['all'] ) ) < $wp_current_filter[] = $hook_name; $all_args = func_get_args(); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection _wp_call_all_hook( $all_args ); >if ( ! isset( $wp_filter[ $hook_name ] ) ) < if ( isset( $wp_filter['all'] ) ) < array_pop( $wp_current_filter ); >return; > if ( ! isset( $wp_filter['all'] ) ) < $wp_current_filter[] = $hook_name; >if ( empty( $arg ) ) < $arg[] = ''; >elseif ( is_array( $arg[0] ) && 1 === count( $arg[0] ) && isset( $arg[0][0] ) && is_object( $arg[0][0] ) ) < // Backward compatibility for PHP4-style passing of `array( &$this )` as action `$arg`. $arg[0] = $arg[0][0]; >$wp_filter[ $hook_name ]->do_action( $arg ); array_pop( $wp_current_filter ); >
Cвязанные функции
События (хуки)
- add_action()
- did_action()
- do_action_ref_array()
- doing_action()
- has_action()
- remove_action()
- remove_all_actions()
Хуки: события, фильтры
- add_filter()
- apply_filters()
- apply_filters_ref_array()
- current_filter()
- doing_filter()
- has_filter()
- remove_all_filters()
- remove_filter()
Easyelectronics.ru
Компилятор не видит структуру из другого файла.(extern и тп)
Заголовок сообщения: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 06 сен 2021, 22:56
Здравствуйте. Компилятор Кейла не видит структуру. Имеется допустим структура, находится в файле main.h
struct button_led <
uint16_t bit_button;
GPIO_TypeDef *gpio_white;
uint16_t pin_white;
GPIO_TypeDef *gpio_green;
uint16_t pin_green;
uint8_t instant_state;
>;
typedef struct button_led Button_led;
И еще одна, находится в файле lcd.h
struct screen < //screen with elements
uint16_t start_x;
uint16_t start_y;
uint8_t activity;
uint8_t refresh;
void* first; //pointer to 1st element on screen
struct screen* next; //pointer to next screen
struct form* form; //parent
>;
typedef struct screen Screen;
Прописываю функцию в файле main.c, экстерналю (объявляю прототип) в файле main.h.
void conditions_buttons(Button_led* b, Screen* p, uint16_t tmp);
В итоге получаю ошибку files\main.h(94): error: #20: identifier «Screen» is undefined
Не видит структуру структуру в другом файле.
С глобальными переменными и с функциями без проблем работает, если структуры в одном файле, тоже работает, вызывать можно с любого места, но в данной ситуации так не прокатывает(
Структура проекта построена так, main.c и main.h в в хедере main.h подключаю остальные хедера используемых файлов и библиотек
#ifndef __MAIN_H
#define __MAIN_H
#include «stm32f2xx.h» // Device header
#include «stm32f2xx_rcc.h»
#include «stm32f2xx_gpio.h»
#include «stm32f2xx_can.h»
#include «misc.h»
#include «stm32f2xx_fsmc.h»
#include «stm32f2xx_exti.h»
#include «stm32f2xx_iwdg.h»
#include «stm32f2xx_tim.h»
#include «CAN.h»
#include «GPIO.h»
#include «rcc.h»
#include «timer.h»
#include «lcd.h»
#include «symbols.h»
Не совсем хочется все структуры запихивать в один файл. Гуглил, люди сталкивались с такой проблемой, но решение я так и не нашел(((
Последний раз редактировалось Sechih 07 сен 2021, 09:37, всего редактировалось 1 раз.
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 06 сен 2021, 23:19
Цитата:
И еще одна, находится в файле lsd.h
Ну так скажите наркотикам — нет, ЖКИ — да.
Цитата:
Гуглил, люди сталкивались с такой проблемой, но решение я так и не нашел(((
Очень вряд ли. Либо вы свою проблему неправильно описываете, либо где-то ошибку допустили.
Цитата:
Структура проекта построена так, main.c и main.h в в хедере main.h подключаю остальные хедера используемых файлов и библиотек
Не очень идея. Лучше из main.c подключайте те .h, которые нужны. Раз уж у вас в main.h ничего из других .h не используется, то нечего лишний раз вкладывать инклюды и инклюды.
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 06 сен 2021, 23:30
#include
#include
void conditions_buttons(Screen* p, uint16_t tmp);
void conditions_buttons(Screen* p, uint16_t tmp) if(p->activity) p->activity = 0;
>
>
int main() Screen test;
printf(«test.activity = %d\n», test.activity);
printf(«test.activity = %d\n», test.activity);
>
struct screen < //screen with elements
uint16_t start_x;
uint16_t start_y;
uint8_t activity;
uint8_t refresh;
void* first; //pointer to 1st element on screen
struct screen* next; //pointer to next screen
struct form* form; //parent
>;
typedef struct screen Screen;
$ rm -f ./main; gcc main.c -o main && ./main
test.activity = 1
test.activity = 0
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 07 сен 2021, 00:11
lsd.h это не lcd.h
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 07 сен 2021, 09:46
Ух ты, с утра, и сразу ЛСД? Забористо живете, однако 🙂 От этого и такой лсд-шный состав структур, такое можно написать только под ЛСД 🙂 Зачем в функции состояния кнопок предавать структуру, относящуюся к LCD?
Создаете файл buttons.h и в нем:
typedef struct <
uint8_t state; // переменная состояния кнопки
void (*button)(int); // связанная функция (указатель)
>btn_t;
btn_t button[4];
и всё, вам больше ничего в этой структуре не надо, никаких привязок к физическим пинам. Физически пины читаются внутри файла исходника buttons.с и для дальнейшей программы они не нужны. На выход вам нужно передать только три-четыре состояния кнопки в одной переменной (не нажата, нажата, отпущена, нажатие с удержанием), а указатель на связанную функцию определяет назначение кнопки, то есть, что выполняется этой кнопкой. Если кнопка не меняет свое назначение в течение всей программы, то можно не использовать этот указатель, а кнопки разделять только по индексу массива. В этом случае даже структура то не нужна.
Далее, без действия ЛСД, создаем файл lcd.h, в котором определяем структуру. хотя, стоп. накой она там нужна в том виде, в котором вы написали? Ладно, не важно, пусть будет:
typedef struct <
uint16_t x;
uint16_t y;
>lcd_coord_t;
И теперь эти два файла ПОДКЛЮЧАЕМ с помощью #include в main.c (в его начале), и теперь становятся доступны обе эти структуры:
#include «buttons.h»
#include «lcd.h»
void Foo(btn_t *buttons, lcd_coord_t point)
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 07 сен 2021, 09:52
NStorm писал(а):
Цитата:
И еще одна, находится в файле lsd.h
Ну так скажите наркотикам — нет, ЖКИ — да.
Извиняюсь, допустил ошибку в сообщении.
Цитата:
Структура проекта построена так, main.c и main.h в в хедере main.h подключаю остальные хедера используемых файлов и библиотек
Не очень идея. Лучше из main.c подключайте те .h, которые нужны. Раз уж у вас в main.h ничего из других .h не используется, то нечего лишний раз вкладывать инклюды и инклюды.
В файле main.c подключается main.h со всеми остальными инклюдами. Скопипастил все инклюды в main.с, получил кучу ошибок, вернул инклюды обратно и все скомпилировалось, наверное это был глюк самого Keil.
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 07 сен 2021, 10:02
Lambo писал(а):
Зачем в функции состояния кнопок предавать структуру, относящуюся к LCD?
Да вопрос был совершенно не в этом, да и поля я некоторые со структур удалил, чтобы меньше места в сообщении занимали. Структура построена так, на дисплее находится форма потом скрин, потом элемент. Все они взаимосвязаны. Структура скрин имеет флаг состояния, активный или неактивный. Вот его я и хочу отследить, чтобы одни и те же кнопки выполняли одни действия на одном скрине, и другие действия на другом.
Заголовок сообщения: Re: Компилятор не видит структуру из другого файла.(extern и тп)
Добавлено: 07 сен 2021, 10:39
Чтобы не было круговых завязок, следует системно подходить к вопросу, разделить и не валить в одну кучу — и низкоуровневые драйверы кнопок, и дисплей, и функции отрисовки дисплея. До тех пор, пока всё свалено в кучу, будут ошибки и путаница. Запишите структуры и подключения так, как показано выше.
Структура кнопки, как я показал ранее, не должна хранить в себе информацию о физическом пине, куда она физически подключена. Для отрисовки на дисплее не имеет значения, куда подключена кнопка.
Цитата:
чтобы одни и те же кнопки выполняли одни действия на одном скрине, и другие действия на другом.
Воооот, именно для этого и применяется связанная функция в структуре кнопки, показанная выше. Указатель на связанную фукнцию (загуглите про указатели на функцию). В зависимости от того, что показывается на дисплее, функции кнопок переназначаются методом назначения указателя на функцию по табличке (карте) кнопок. Этим назначением занимается отдельная функция, которая вызывается в момент смены информации на экране и переназначает указатели на связанные функции кнопок. Вот примерно так:
buttons.c
typedef struct uint8_t state; // переменная состояния кнопки
uint8_t id; // идентификатор функции кнопки
void (*exec)(int); // связанная функция (указатель)
>btn_t;
btn_t button[4];
/**
* \brief Назначение кнопкам исполняемых функций
* согласно карте кнопок
* @param id — идентификатор карты кнопок
*/
void Buttons_Assign(uint8_t id)
switch(id) /* карта кнопок по умолчанию */
case BTNASSIGN_DEFAULT:
button[0].exec = GUI_CallMenu;
button[1].exec = (void*)0;
button[2].exec = (void*)0;
button[3].exec = (void*)0;
break;
/*. */
/* карта кнопок в режиме отображения списка меню */
case BTNASSIGN_MENULIST:
button[0].exec = GUI_MenuExit;
button[1].exec = GUI_MenuNavi;
button[2].exec = GUI_MenuNavi;
button[3].exec = GUI_MenuSelectItem;
break;
/*. */
/* карта кнопок в режиме отображения параметра пункта меню */
case BTNASSIGN_MENUPARAM:
button[0].exec = GUI_MenuItemExit;
button[1].exec = GUI_MenuItemChange;
button[2].exec = GUI_MenuItemChange;
button[3].exec = GUI_MenuItemConfirm;
break;
/*. */
>
>//———————————————————
/**
* \brief Выбор функции и исполнение действия по кнопке
* согласно назначенной карты кнопок
* @param id — идентификатор кнопки
*/
void Buttons_Code(uint8_t id)
switch(id) case BTNCODE_MENU:
if(button[0].exec != 0)
button[0].exec(0);
break;
/*. */
case BTNCODE_UP:
if(button[1].exec != 0)
button[1].exec(1);
break;
/*. */
case BTNCODE_DN:
if(button[2].exec != 0)
button[2].exec(-1);
break;
/*. */
case BTNCODE_ENT:
if(button[3].exec != 0)
button[3].exec(0);
break;
/*. */
>
>//———————————————————
Так же и менюшка (я понимаю, вы пытаетесь менюшку сделать), не должна быть привязана к координатам дисплея. Структура меню относится только к пунктам меню, безотносительно типа дисплея, она должна работать вообще без дисплея. А уж отрисовка элементов на дисплее, это задача связанной с элементом меню функции.
static menu_t item1, item2, item3, item4, item5, item6;
Как вызвать функцию из другого файла php
Роберт Басыров
Сложность урока:
3 уровень — средняя сложность. Необходимо внимание и немного подумать.
Недоступно в лицензиях:
Ограничений нет
Модули могут взаимодействовать между собой двумя способами: явно (прямым вызовом) и скрыто (через систему событий).
Явное взаимодействие
Явное взаимодействие с помощью API. Подразумевает подключение модуля с помощью метода CModule::IncludeModule(указав в качестве параметра id модуля) с последующим непосредственным вызовом метода класса или функции модуля.
Пример явного взаимодействия:
Взаимодействие через события
Событие — это какое-либо произвольное действие, в момент выполнения которого (до или после) собираются все обработчики этого события и выполняются по одному.
Сущность событие позволяет сделать модули максимально независимыми друг от друга. Модуль ничего не знает об особенностях функционирования другого модуля, но может взаимодействовать с ним через интерфейс событий.
- Собрать все зарегистрированные обработчики с помощью функции GetModuleEvents.
- Выполнить их по одному с помощью функции ExecuteModuleEvent, обрабатывая соответствующим образом возвращаемые обработчиками значения.
- Зарегистрировать в момент инсталляции свой обработчик с помощью функции RegisterModuleDependences.
- Соответственно необходимо иметь эту функцию-обработчик и убедиться, что скрипт, в котором эта функция находится, подключается в файле /bitrix/modules/ID модуля/include.php .
Пример взаимодействия
Ярким примером взаимодействия такого типа является взаимодействие модулей системы с модулем Поиска. Этот модуль не имеет никакой информации о данных других модулей, особенностях их хранения и обработки. Он только предоставляет интерфейс для индексации данных. Любой модуль системы, который должен индексироваться, при инсталляции регистрирует обработчик на событие OnReindex. Каждый такой обработчик в свою очередь возвращает данные для индексации, которые модуль Поиска использует для наполнения своей базы.
Коды примеров взаимодействия через события:
Fetch()) < // и их выполнение по одному if(!ExecuteModuleEvent($arHandler, $param1, $param2)) < // если обработчик вернет false, // то например, вернем надпись "I can't do it. " return "I can't do it. "; >> return "I have done it!"; > ?>
