• Всем привет.
    Запутался, помогите.
    Есть плагин баланса, в нем есть файлы-классы, в них публичные функции.
    В одном из файлов подходящая мне функция, которую я хочу использовать для пополнения баланса:

    public function deposit($user_id, $number){
        $user_wallet = $this->getUserWallet($user_id);
        $wallet = fre_credit_convert_wallet($number);
        $number = FRE_Credit_Currency_Exchange()->convertToUserCurrency($user_id, $wallet);
        $user_wallet->balance = $number + $user_wallet->balance;
        FRE_Credit_Users()->setUserWallet($user_id, $user_wallet);
    }

    это функция пополнения баланса.
    Как ее правильно использовать в другом файле на определенной странице (файле) темы, например будет страница пополнения баланса.
    На эту страницу обязательно будет подключать этот файл класса (include_once), чтобы функция стала доступна? Она же публичная.
    Может ее скопировать в то место, куда необходимо, будет задвоение, это неправильно? Но как быть с переменными внутри? Заглобалить их?
    Может быть ее можно просто вызвать на нужной странице из файла класса, подставив свои данные в переменные? Как?
    Эта идея вообще возможна?

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Все зависит от области видимости класса.
    Ты вызови. А если фаталити словишь — то подключай класс. Ну или всегда можно проверять — а существует ли класс.

    Автор rsl89

    (@rsl89)

    Это вроде как метод класса, как его вызвать?

    Автор rsl89

    (@rsl89)

    Подскажите как это сделать без ООП?
    При помощи new?

    $newclass = new FRE_Credit_Users {
    
    public function deposit ($user_id, $number){
        $user_wallet = $this->getUserWallet($user_id);
        $wallet = fre_credit_convert_wallet($number);
        $number = FRE_Credit_Currency_Exchange()->convertToUserCurrency($user_id, $wallet);
        $user_wallet->balance = $number + $user_wallet->balance;
        FRE_Credit_Users()->setUserWallet($user_id, $user_wallet);
    }
    }

    (сам класс называется: class FRE_Credit_Users extends AE_Base{ …})

    вызов функции:

    $funcname = "deposit";
    $vizov->$funcname();

    Как-то так? Можете помочь?

    • Ответ изменён 4 года назад пользователем rsl89.
    Модератор Юрій

    (@yube)

    Подскажите как это сделать без ООП?

    ООП без ООП? Так не бывает.

    Как-то так

    
    require_once 'путь к файлу с классом';
    $obj = new FRE_Credit_Users();
    $obj->deposit($user_id, $number);
    

    $user_id, $number — заменить на реальные или присвоить значения.
    Возможно, конструктору FRE_Credit_Users требуются параметры, но отсюда этого не видно.

    Автор rsl89

    (@rsl89)

    Так я и сделал по началу.
    Вышла ошибка дебаггера:
    FRE_Credit_Users не будет найдено

    тогда я сделал так:

    include_once plugin_dir_path( __FILE__ )."class-credit-users.php";
    $user_id=1;
    $number=1000;
    FRE_Credit_Users::getInstance()->deposit($user_id, $number);

    но теперь просит подключить класс, который подключается в нашем классе, дебаггер начал ругаться на строку:
    Fatal error: Uncaught Error: Class ‘FRE_Credit_Wallet’ not found in C:\Webserver\OSPanel\domains\testmysite1\wp-content\plugins\fre-credit\class-credit-users.php on line 222

    строка с якобы ошибкой:
    $user_wallet = new FRE_Credit_Wallet();

    т.е. еще и этот класс FRE_Credit_Wallet(); нужно подключить?

    Автор rsl89

    (@rsl89)

    решил посмотреть что будет и подключил все классы на которые ругался дебаггер, в итоге получилось вот что:

    include_once plugin_dir_path( __FILE__ )."class-credit-users.php";
    include_once plugin_dir_path( __FILE__ )."class-credit-wallet.php";
    include_once plugin_dir_path( __FILE__ )."class-credit-currency.php";

    но теперь ошибка вернула нас в класс class-credit-users из которого мы с самого начала и начали подключать метод, ошибка:
    Fatal error: Uncaught Error: Call to undefined function fre_credit_convert_wallet() in
    на строку:
    $wallet = fre_credit_convert_wallet($number);

    Автор rsl89

    (@rsl89)

    В классе FRE_Credit_Users из которого я пытаюсь вызвать deposit есть еще метод:

        public function init(){
            $this->add_filter( 'ae_pack_post_types', 'fre_credit_pack_post_type' );
            $this->add_action( 'ae_select_process_payment', 'fre_credit_process_payment', 10, 2 ); //big update in verson 1.2.3
            $this->add_action( 'save_post', 'fre_credit_cash_approved', 10, 2 ); // 1.2.3 cash approve
            $this->add_action('wp_ajax_fre-withdraw-sync', 'withdraw');
            $this->add_action('wp_ajax_fre-credit-get-balance-info', 'getBlanceInfo');
            $this->add_action('wp_ajax_fre-credit-get-profile-info', 'getProfileInfo');
            $this->add_action('wp_ajax_fre-credit-update-email-paypal', 'updatePaypalCredit');
            $this->add_action('wp_ajax_fre-credit-update-bank', 'updateBank');
            $this->add_action('wp_ajax_fre-credit-request-secure-code', 'requestSecureCode');
            $this->add_action('ae_after_update_order' , 'update_order_credit');
    
            $this->add_filter( 'fre_order_infor','buy_credit_order_infor'); //@since 1.2.3
        }

    может быть в нем дело?

    Автор rsl89

    (@rsl89)

    В общем ситуация проясняется, в файле functions как раз и обьявляется не найденная функция, я и его подключил.

    include_once plugin_dir_path( __FILE__ )."class-credit-users.php";
    include_once plugin_dir_path( __FILE__ )."class-credit-wallet.php";
    include_once plugin_dir_path( __FILE__ )."class-credit-currency.php";
    include_once plugin_dir_path( __FILE__ )."class-credit-currency-exchange.php";
    include_once plugin_dir_path( __FILE__ )."functions.php";
     
    $user_id=1;
    $number=1000;
    FRE_Credit_Users::getInstance()->deposit($user_id, $number);
    

    заработало баланс пополняется, только теперь задвоение, баланс пополняет сразу на 2000
    ну и скорее всего потому что у нас подключен
    include_once plugin_dir_path( __FILE__ )."class-credit-users.php";
    где есть переменная $number и мы вызываем метод:
    FRE_Credit_Users::getInstance()->deposit($user_id, $number);
    получаетcя что $number 2 раза отрабатывает что ли?

    Автор rsl89

    (@rsl89)

    я так понимаю нужно грамотную функцию написать, чтобы подключаемый файл не отрабатывал переменную $number, а срабатывал только наш подключенный метод

    Ты напрямую в functions вставляешь то что написал?

    Или это обернуто в функцию?

    дело в том что есть хуки — init, wp и другие. Так может класс подключается на более поздний — вот его и нет в видимости.

    Что автор плагина не помогает в этом вопросе?

    Автор rsl89

    (@rsl89)

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

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Вызов публичной функции в другом месте» закрыта для новых ответов.