Autor Zpráva
Musilda
Profil
Zdravím,

mám dotaz k použití magických metod. Nejsem si jist, zda jsem to pochopil správně. Uvedu příklad z woocommerce, třída customer.
Je definováno protected $_data;, a v constructu je pole:

$this->_data = array(
                'country'                 => esc_html( $country ),
                'state'                 => '',
                'postcode'                 => '',
                'city'                    => '',
                'address'                 => '',
                'address_2'             => '',
                'shipping_country'         => esc_html( $country ),
                'shipping_state'         => '',
                'shipping_postcode'     => '',
                'shipping_city'            => '',
                'shipping_address'        => '',
                'shipping_address_2'    => '',
                'is_vat_exempt'         => false,
                'calculated_shipping'    => false
            );

V dalších metodách, ale přistupuje k jednotlivým položkám pole pomocí $this->klíč:

public function get_state() {
        if ( isset( $this->state ) ) return $this->state;
    }

Dále třída obsahuje metody __isset, __get a __set:

    public function __isset( $property ) {
        return isset( $this->_data[ $property ] );
    }

    public function __get( $property ) {
        return isset( $this->_data[ $property ] ) ? $this->_data[ $property ] : null;
    }

    public function __set( $property, $value ) {
        $this->_data[ $property ] = $value;
        $this->_changed = true;
    }

Tuším, ale nevím, zda správně, že přistupuje do toho pole hodnot pomocí __get a __isset.
Můžete mi prosím někdo vysvětlit princip?

Díky za odpovědi.
Tori
Profil
Působí to na mě, že hlavním důvodem, proč to udělali takto (místo běžných vlastností třídy) je zřejmě řádek $this->_changed = true; - asi se na konci zpracování požadavku automaticky updatují v DB data změněných objektů.
Musilda
Profil
Ale mě jde spíše o to, že v get metodách, jako je třeba ta get_state neodkazuje na proměnnou $this->_data['state'], ale $this->state
han5vk
Profil
Musilda:
No, pretože magická __get pri každom prístupe k premennej objektu vykoná kód ktorý v sebe má, teda v tomto prípade pri volaní $this->niečo si overí či to niečo v dátach má, ak áno, tak vráti premennú z poľa $this->_data[] . Čo je ti vlastne nejasné?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: