Suprascrierea unei funcții într-o clasă de plugin

18 oct. 2017, 11:02:35
Vizualizări: 17.8K
Voturi: 5

Am ceva similar cu aici.

Într-o clasă de plugin third-party avem o funcție pe care vreau să o suprascriu prin extinderea acelei clase.

Funcția originală din clasă:

class Import_Facebook_Events_Facebook {
    public function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            return null;
        }
        //alt cod aici
}

Ce am încercat eu, dar nu a funcționat (niciun efect):

class Import_Facebook_Events_Facebook_Ext extends Import_Facebook_Events_Facebook {
    public function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            $facebook_event->place->id = ''; //am adăugat această linie
            //return null;
        }
        //alt cod aici
}

new Import_Facebook_Events_Facebook_Ext();

Ce este greșit aici? Cum pot obține efectul dorit?

Clasa originală Import_Facebook_Events_Facebook() este instanțiată dintr-o altă clasă:

class Import_Facebook_Events{

    private static $instance;

    public static function instance() {
        if( ! isset( self::$instance ) && ! (self::$instance instanceof Import_Facebook_Events ) ) {
            self::$instance = new Import_Facebook_Events;

            self::$instance->facebook = new Import_Facebook_Events_Facebook();

        }
        return self::$instance; 
    }
}

Și clasa de mai sus este instanțiată dintr-o funcție separată:

function run_import_facebook_events() {
    return Import_Facebook_Events::instance();
}
5
Comentarii

Presupun că ai putea încerca să suprascrii instanța ulterior. De exemplu: Import_Facebook_Events::$instance = Import_Facebook_Events_Ext::instance(); ... altfel, ar trebui să te întorci la ce rulează run_import_facebook_events pentru a vedea dacă poți suprascrie la acel nivel superior.

majick majick
18 oct. 2017 11:15:27

@majick Am încercat asta și am primit o pagină cu mesajul This page isn’t working. infopsi.md is currently unable to handle this request. HTTP ERROR 500.

Iurie Iurie
18 oct. 2017 11:33:38

înainte de a instanția noua ta clasă, trebuie să oprești instanțierea clasei originale și apoi trebuie să afli unde se întâmplă acest lucru.

mmm mmm
18 oct. 2017 12:38:28

@mmm Am adăugat un răspuns, poți să te uiți la el?

Iurie Iurie
18 oct. 2017 13:08:45

@majick Am adăugat un răspuns, poți să te uiți la el?

Iurie Iurie
18 oct. 2017 13:09:35
Toate răspunsurile la întrebare 1
1

În sfârșit, am reușit să rezolv problema mea:

class Import_Facebook_Events_Facebook_Ext extends Import_Facebook_Events_Facebook {

    function get_location( $facebook_event ) {

        if ( !isset( $facebook_event->place->id ) ) {
            $facebook_event->place->id = '';
            //return null;
        }
        //alte instrucțiuni aici

        return $event_location;
    }
}

$new_ife_events = run_import_facebook_events();
$new_ife_events->facebook = new Import_Facebook_Events_Facebook_Ext();

O întrebare: ultimele două linii de cod trebuie incluse într-o funcție/acțiune?

18 oct. 2017 13:07:52
Comentarii

soluție bună, se pare că ai putea folosi asta oriunde ai nevoie... depinde doar de unde vrei să folosești efectiv $new_ife_events

majick majick
18 oct. 2017 16:30:10