Verschil tussen self:: & $this

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Andreas Warnaar

Andreas Warnaar

04/09/2008 21:39:00
Quote Anchor link
Ik kom regelmatig codes tegen waarin self:: gebruikt wordt ipv $this-> .

Er zal een goede reden voor zijn maar ik zou graag weten wat de reden is..
 
PHP hulp

PHP hulp

21/11/2024 22:15:52
 
Jelmer -

Jelmer -

04/09/2008 21:52:00
Quote Anchor link
self:: verwijst naar de definitie van de klasse, en $this naar de instantie. self:: gebruik je dus voor de static variabelen & functies welke gedeeld zijn met alle instanties van een bepaalde klasse (en daarbuiten als ze met 'public' gemarkeerd zijn)

$this verwijst zoals je wel weet waarschijnlijk naar de eigenschappen van de huidige instantie, en deelt deze eigenschappen ook alleen met de instantie en niet met andere instanties.

Vuistregeltje: self:: & static zijn voor delen van klassen die niet onderdeel zijn van de 'state', de toestand van de klasse en die dus met alle instanties veilig gedeeld kunnen worden. Daarom kan je ook nooit $this in een static functie gebruiken. Bijvoorbeeld een hulpfunctie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
class SecureHTTPRequest {
    static protected encryptData($data, $key);

    public function sendData($data) {
        fwrite($this->socket, self::encryptData($data, $this->key));
    }
}

?>


encryptData() kan hier heel goed static zijn omdat het geen state deelt met de rest van de klasse. Het is slechts een hulpfunctie.
 
Rens nvt

Rens nvt

04/09/2008 21:53:00
Quote Anchor link
self gebruik je wanneer er geen instantie van de classe is, bijvoorbeeld bij static functions.

voorbeeld code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
    class zoek
    {
        function
bestand($naam)
        {

            return 'locatie';
        }
    }


        // Instantie
    $zoek = new zoek();
    echo $zoek->bestand('file.txt');
    
        // Static
    echo zoek::bestand('file.txt');    
?>


In het eerste geval zie je hier een variabele $zoek, die een instantie is van de class zoek. Die instantie $zoek heeft zijn eigen functies en variabelen, en als je die wilt aanroepen vanuit bijvoorbeeld de functie bestand(), dan gebruik je $this ($this is dus een verwijzing naar de huidige instantie van de class)

Het 2e geval maakt geen instantie van de class aan, $this bestaat in dit geval dus ook niet. Als je nu een andere functie uit de class aan wilt roepen kun je dit doen door het gebruik van self::functie().

*grin* een lang bericht typen levert wel eens dubbele verhalen op ;-) Hopelijk dat je hier verder mee komt. :-)
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
 
Andreas Warnaar

Andreas Warnaar

04/09/2008 22:07:00
Quote Anchor link
Heel duidelijk. Bedankt voor jullie uitleg..

Andreas
 
Lode

Lode

05/09/2008 06:53:00
Quote Anchor link
self kan je ook gebruiken voor het aanmaken van een instantie van de class waar je in zit. En ook een vergelijking met instanceof.

Bijvoorbeeld een singleton:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Lode{

   static protected $_instance = null;

   static public function singleton(){
        if(!$this->_instance instanceof self){ //
             $this->_instance = new self; //
        }
        return $this->_instance;
   }

   final protected function __construct(){}
   private function __clone(){}
}

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.