За последние 24 часа нас посетили 54004 программиста и 14852 робота. Сейчас ищут 1523 программиста ...

Fatal error: Cannot redeclare - PHP

Тема в разделе "PHP для новичков", создана пользователем roma28, 19 окт 2017.

  1. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Fatal error: Cannot redeclare example_exchangebox_merchant_xchanger_after() (previously declared in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/merchantscript/webmoey/function.php:146) in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/merchantscript/yamoney/function.php on line 154 Пишет такую ошибку так как вызывается 2 раза одна и та-же функция. Как мне с помощью пространственых имен php сделать так что бы оба вала работали как один ? При написании кода в оба файла function.php namespace в начале документа выдает ошибку
    PHP:
    1. <?php
    2. /*
    3. ВНИМАНИЕ! Все функции должны быть уникальны!
    4. Если вы не умеете работать с фильтрами Wordpress и не понимаете их принципа, закройте этот файл и ничего не трогайте!
    5. */
    6.  
    7. /*
    8. Первым делом, подгружаем нащи переменные из определенного файла.
    9. Для этого указываем путь, к нашему файлу.
    10. */
    11. $path = get_merchant_file(__FILE__);
    12. pn_template($path . '/dostup/index');
    13.  
    14.  
    15. /*
    16. Мерчант обязан иметь уникальный ключ, название и заголовок. В противном случае, будут проблемы.
    17. Данные устанавливаем с помощью следующего фильтра.
    18. В переменной $merchants находится массив всех мерчантов.
    19.  
    20. Указав данные в этой функции, мерчант автоматически будет подключен и появиться в настройках, а также на странице настроек мерчанта и при редактировании валюты.
    21. */
    22. add_filter('exchangebox_merchant_list_one','example_exchangebox_merchant_list_one');
    23. function example_exchangebox_merchant_list_one($merchants){
    24.  
    25.     $merchants[] = array(
    26.         'key' => '100',
    27.         'name' => 'example',
    28.         'title' => 'Example'
    29.     );
    30.  
    31.     return $merchants;
    32. }
    33.  
    34. /*
    35. exchangebox_merchant_list_before - не обязательный фильтр на странице настроек марчанта.
    36. Данные из этого фильтра, выводятся на странице настроек марчанта, выше формы.
    37.  
    38. Функция, имеет переменную $place, которая содержит данные о выбранном мерчанте. Используется name из функции определения мерчанта exchangebox_merchant_list.
    39. */
    40. add_action('before_merchant_admine_try','example_before_merchant_admin_try');
    41. function example_before_merchant_admin_try($place){
    42.  
    43.     if($m_id == 100){
    44.         /* выводим данные для нашего конкретного мерчанта */
    45.     }
    46.  
    47. }
    48.  
    49. /*
    50. Если нам необходимо указать подсказки ниже инструкции, существует фильтр exchangebox_merchant_list_helps
    51. Фильтр имеет пару переменных:
    52. $m_id - key мерчанта
    53. */
    54. add_action('merchant_admin_test','example_merchant_admin_test',99,2);
    55. function example_merchant_admin_test($m_id, $data){
    56.  
    57.     if($m_id == 100){
    58.      
    59.         pn_textfield('','
    60.        Подсказка нашего мерчанта
    61.        ');
    62.      
    63.     }
    64.  
    65. }
    66.  
    67. /*
    68. фильтр, влияющий на кнопку "проверить оплату"
    69.  
    70. В фильтр передается 3 параметра:
    71. $gmerchant - статус вывода кнопки "проверить оплату". 0-не выводить, 1-выводить
    72. $status - статус заявки (new - новая)
    73. $merchant_key - ключ мерчанта.
    74. Ключ назначается автоматически, если мерчант отключен для данной валюты или не назначен, ключа не будет.
    75.  
    76. */
    77. add_filter('exchangebox_merchant_gmerchant_exp','example_exchangebox_merchant_gmerchant_exp',99,3);
    78. function example_exchangebox_merchant_gmerchant_exp($gmerchant, $status, $merchant_key){
    79.  
    80.     if($status=='new' and is_enable_merchat(100) and $merchant_key==100){
    81.         $gmerchant = 1;
    82.     }
    83.  
    84.         return $gmerchant;
    85. }
    86.  
    87. /*
    88. фильтр, корретирующий сумму оплаты, в блоке заявки
    89.  
    90. Имеет следующие переменные:
    91. $summ - текущее значение суммы, к оплате
    92. $merchant_key - ключ мерчанта.
    93. Ключ назначается автоматически, если мерчант отключен для данной валюты или не назначен, ключа не будет.
    94. */
    95. add_filter('exchangebox_merchant_sumpay_xp','example_exchangebox_merchant_sumpay_xp',99,2);
    96. function example_exchangebox_merchant_sumpay_xp($summ, $merchant_key){
    97.     if(is_enable_merchat(100) and $merchant_key==100){
    98.         /* задаем новую сумму, при необходимости */
    99.     }
    100.  
    101.     return $summ;
    102. }
    103.  
    104. /*
    105. Фильтр замены кнопки оплатить.
    106.  
    107. Имеет следующие переменные:
    108. $paybutton - код формы оплаты
    109.  
    110. $merchant_key - ключ мерчанта.
    111. Ключ назначается автоматически, если мерчант отключен для данной валюты или не назначен, ключа не будет.
    112.  
    113. $naps - данные по направлению обмена из таблицы БД napobmens. Данные хранятся в объекте.
    114.  
    115. $data - данные обмена из таблицы БД bids. Данные хранятся в объекте.
    116. */
    117.  
    118. add_filter('exchangebox_merchant_paybutton_xpp','example_exchangebox_merchant_paybutton_xpp',99,4);
    119. function example_exchangebox_merchant_paybutton_xpp($paybutton, $merchant_key, $naps, $data){
    120.  
    121.     if(is_enable_merchat(100) and $merchant_key==100){
    122.      
    123.         return 'Новая кнопка оплаты';
    124.      
    125.     }
    126.  
    127.     return $paybutton;
    128.  
    129. }
    130.  
    131. /*
    132. Фильтр вывода дополнительного контента, после заявки
    133.  
    134. Имеет следующие переменные:
    135. $content - дополнительный код
    136.  
    137. $merchant_key - ключ мерчанта.
    138. Ключ назначается автоматически, если мерчант отключен для данной валюты или не назначен, ключа не будет.
    139.  
    140. $naps - данные по направлению обмена из таблицы БД napobmens. Данные хранятся в объекте.
    141.  
    142. $data - данные обмена из таблицы БД bids. Данные хранятся в объекте.
    143. */
    144.  
    145. add_filter('exchangebox_merchant_xchanger_after','example_exchangebox_merchant_xchanger_after',99,4);
    146. function example_exchangebox_merchant_xchanger_after($content, $merchant_key, $naps, $data){
    147.  
    148.     if(is_enable_merchat(100) and $xzt==100){
    149.      
    150.     }
    151.  
    152.     return $content;
    153.  
    154. }
    155.  
    156.  
    157. ?>
    [​IMG]
    [​IMG]
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    756
    Адрес:
    Татарстан
    переводить не пробовали?
    Пишет же повторно объявлена функция такая-то (ранее была объявлена - тут-то и тут-то)
    не нужно два раза объявлять одну и ту же функцию
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Я не знаю WordPress, но я бы создал файл, в котором описал бы твою функцию:
    PHP:
    1. <?php
    2. // new_file.php
    3.  
    4. namespace custom_functions;
    5.  
    6.  
    7. example_exchangebox_merchant_xchanger_after()
    8. {
    9.            // TO DO: Describe your logic
    10. }
    Затем включил бы new_file.php в основной, добавил в самом начале основного
    PHP:
    1. use custom_functions as cf;
    и вызвал бы ее
    PHP:
    1. cf\example_exchangebox_merchant_xchanger_after();
     
  4. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Читайте внимательно пост темы!!!
     
  5. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Если в
    function.php двух файлах написать namespace custom_functions; пишет что warning: invalid argument supplied for for each () in settings.php
    И warning : call_user_func_array () expects parameter 1 to be a valid callback function 'exampl' not found or invalid function name in plugins. Php
     
  6. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Namespace в разных файлах должен быть разным, иначе толк от него.
    Изучите namespace. Поэспериментируйте в тестовом проекте.

    По поводу warning: невалидные аргументы передаются в функции each() и call_user_func_array()
     
  7. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Он и так разный в двух документах в одно документе function.php
    PHP:
    1. <?php
    2. namespace test
    3. /*
    4. ВНИМАНИЕ! Все функции должны быть уникальны!
    5. Если вы не умеете работать с фильтрами Wordpress и не понимаете их принципа, закройте этот файл и ничего не трогайте!
    6. */
    7.  
    8. /*
    9. Первым делом, подгружаем нащи переменные из определенного файла.
    10. Для этого указываем путь, к нашему файлу.
    11. */
    12. $path = get_merchant_file(__FILE__);
    13. pn_template($path . '/dostup/index');
    а в во 2
    PHP:
    1. <?php
    2. namespace food
    3. /*
    4. ВНИМАНИЕ! Все функции должны быть уникальны!
    5. Если вы не умеете работать с фильтрами Wordpress и не понимаете их принципа, закройте этот файл и ничего не трогайте!
    6. */
    7.  
    8. /*
    9. Первым делом, подгружаем нащи переменные из определенного файла.
    10. Для этого указываем путь, к нашему файлу.
    11. */
    12. $path = get_merchant_file(__FILE__);
    13. pn_template($path . '/dostup/index');
    но тогда вылазит ошибка function.php если в двух файлах написать namespace пишет что warning: invalid argument supplied for for each () in settings.php
    И warning : call_user_func_array () expects parameter 1 to be a valid callback function 'exampl' not found or invalid function name in plugins. Php
     
    #7 roma28, 19 окт 2017
    Последнее редактирование: 19 окт 2017
  8. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    После namespace <имя пространства имён> должнен стоять ;
     
  9. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'example_exchangebox_merchant_list' not found or invalid function name in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-includes/plugin.php on line 235

    Warning: Invalid argument supplied for foreach() in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/default/merchant/settings.php on line 22
    settings.php
    В файле прописал только function.php написал namespace custom_functions;
    Без use
    settings.php
    PHP:
    1. <?php[/B][/B]
    2. [B][B]if( !defined( 'ABSPATH')){ exit(); }
    3.  
    4.  
    5. add_action('adminpage_title_pn_merchants', 'adminpage_title_pn_merchants');
    6. function adminpage_title_pn_merchants(){
    7.     _e('Merchants settings','pn');
    8. }
    9.  
    10. add_action('adminpage_content_pn_merchants','def_adminpage_content_pn_merchants');
    11. function def_adminpage_content_pn_merchants(){
    12. global $wpdb;
    13.      
    14.  
    15.     $list_merchants = apply_filters('exchangebox_merchant_list',array());
    16. ?>
    17.  
    18. <div class="premium_body">
    19.      
    20.     <table class="premium_standart_table">
    21.         <?php
    22.                 foreach($list_merchants as $data){  
    23.                 $id = is_isset($data,'key');
    24.                 $title = is_isset($data,'title');
    25.              
    26.                 pn_select($title, 'm_'.$id ,array('0'=>__('Disabled','pn'), '1'=>__('Enabled','pn')), is_enable_merchant($id),'merchant_change');  
    27.             }
    28.         ?>
    29.     </table>
    30.      
    31. </div>
    32.  
    33. <script type="text/javascript">  
    34. $(function(){
    35.  
    36.     $('.merchant_change select').live('change', function(){
    37.         var id = $(this).attr('name').replace('m_','');
    38.         var wid = $(this).val();
    39.         var thet = $(this);
    40.         thet.attr('disabled',true);
    41.      
    42.         $('#premium_ajax').show();
    43.         var dataString='id=' + id + '&wid=' + wid;
    44.      
    45.         $.ajax({
    46.             type: "POST",
    47.             url: "<?php the_link_toajax('merchant_settings_save'); ?>",
    48.             dataType: 'json',
    49.             data: dataString,
    50.             success: function(ht)
    51.             {
    52.                 $('#premium_ajax').hide();  
    53.                 thet.attr('disabled',false);
    54.             }
    55.         });
    56.  
    57.         return false;
    58.     });  
    59.  
    60. });
    61. </script>          
    62. <?php
    63. }
    64.  
    65. add_action('myaction_post_merchant_settings_save', 'pn_myaction_post_merchant_settings_save');
    66. function pn_myaction_post_merchant_settings_save(){
    67. global $wpdb;
    68.  
    69.     only_post();
    70.  
    71.     if(current_user_can('administrator')){
    72.      
    73.         $id = intval(is_param_post('id'));
    74.         $wid = intval(is_param_post('wid'));
    75.      
    76.         $merchants = get_option('merchants');
    77.         if(!is_array($merchants)){ $merchants = array(); }
    78.      
    79.         $merchants[$id] = $wid;
    80.      
    81.         update_option('merchants', $merchants);
    82.          
    83.     }        
    84.      
    85. }

    PHP:
    1. <?php[/B][/B]
    2. [B][B]
    3.  
    4.  
    5.     do {
    6.         foreach ( (array) current($wp_filter[$tag]) as $the_ )
    7.             if ( !is_null($the_['function']) ){
    8.                 $args[1] = $value;
    9.                 $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
    10.             }
    11.  
    12.     } while ( next($wp_filter[$tag]) !== false );
    13.  
    14.     array_pop( $wp_current_filter );
    15.  
    16.     return $value;
    17. }

     
  10. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Как я понел
    PHP:
    1. Warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'example_exchangebox_merchant_list' not found or invalid function name
    Из предупреждения видно, либо функция не определена либо она неверно задана.
    PHP:
    1. Warning: Invalid argument supplied for foreach() in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/default/merchant/settings.php on line 22
    Такое предупреждение обычно возникает если передается пустой массив. Если в одном файле написать Namespace.
    Я так думаю это из за того что при написаний namespace функция example_exchangebox_merchant_list не может сработать из за этого. Как это можно исправить ?
     
  11. Каменьвогород

    С нами с:
    19 окт 2017
    Сообщения:
    12
    Симпатии:
    1
    Почему бы просто не переименовать функцию? Не обязательно юзать namespace.
     
  12. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Тогда скрипт перестает работать
     
  13. Каменьвогород

    С нами с:
    19 окт 2017
    Сообщения:
    12
    Симпатии:
    1
    Убирайте свой фильтр, проверяйте, будет ли работать код без него.
    Если работает, ищите ошибку в функции, которую цепляете на фильтр.

    Проверьте сам хук, которым пользуетесь.
    Может он принимает ограниченное количество подключаемых фильтров (и такое бывает).

    Юзайте IDE + wp расширение для нее - будет вам ошибки подсвечивать.
    Debug, говорят, хорошая штука.
     
  14. roma28

    roma28 Новичок

    С нами с:
    19 окт 2017
    Сообщения:
    8
    Симпатии:
    0
    Если подключать только один хук то все работает, а когда 2 подключаешь пишет ошибку
    PHP:
    1. Fatal error: Cannot redeclare example_exchangebox_merchant_xchanger_after() (previously declared in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/merchantscript/webmoey/function.php:146) in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/merchantscript/yamoney/function.php on line 154 Пишет такую ошибку так как вызывается 2 раза одна и та-же функция.
    --- Добавлено ---
    Если подключать только один хук то все работает, а когда 2 подключаешь пишет ошибку
    PHP:
    1. Fatal error: Cannot redeclare example_exchangebox_merchant_xchanger_after() (previously declared in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/merchantscript/webmoey/function.php:146) in /home/users/r/rovchinnikov94/domains/epicgamer.ru/wp-content/plugins/exchangebox/merchantscript/yamoney/function.php on line 154 Пишет такую ошибку так как вызывается 2 раза одна и та-же функция.
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @roma28, все-таки переименуйте в одном месте функцию.
    И именно это новое имя укажите в качестве второго параметра функции add_filter.