Static keyword (vanaf PHP 5.3?)

Bekijk dit stukje script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
class Foo
{
    public function foobar()
    {

        echo 'foobar';    
    }    
}


Foo::foobar();
?>


In PHP 5 krijg je nu te zien: foobar

In PHP 6 krijg je nu te zien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Strict Standards: Non-static method Foo::foobar() should not be called statically in C:\server\www6\testje.php on line 10


Je probeert hier namelijk de method foobar() statisch aan te roepen met ::. Dat mag niet, want het is geen statische functie.

Zoals je ziet is PHP 6 in alles stricter geworden, dat is postief!

__callStatic()
Dit wordt de nieuwe magic method die hetzelfde werkt als __call alleen dan voor static methods.

Late static binding
In PHP 5.2 en lager heb je het volgende vervelende probleem. Bekijk dit script:

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
17
18
19
20
21
22
23
24
25
26
<?php

class A
{
    public static function wiebenik()
    {

        echo __CLASS__;    
    }
    
    
    public static function weergeefmij()
    {

        self::wiebenik();
    }    
}


class B extends A
{
    public static function wiebenik()
    {

        echo __CLASS__;    
    }
}


B::weergeefmij();

?>


Je zou nu willen dat B het antwoord is, want self::wiebenik() zou de function in B moeten aanroepen, want die overschrijft A. Maar dit script geeft echter A als output.

Vanaf PHP 5.3 heb je hier een oplossing voor, namelijk static::wiebenik().

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
17
18
19
20
21
22
23
24
25
26
<?php

class A
{
    public static function wiebenik()
    {

        echo __CLASS__;    
    }
    
    
    public static function weergeefmij()
    {

        static::wiebenik();
    }    
}


class B extends A
{
    public static function wiebenik()
    {

        echo __CLASS__;    
    }
}


B::weergeefmij();

?>


Zo kun je dus ook bij een static function de echte class krijgen. Normaal is dat een probleem omdat static bij het compileren anders werkt.

Bedankt Jelmer voor de hint

Al deze wijzigingen worden mogelijk in PHP 5.3 al geintroduceerd.

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Installatie PHP 6 naast PHP 5
  2. Inleiding
  3. Bye@ Register_globals, magic_quotes, mysql_query()
  4. Namespaces (vanaf PHP 5.3)
  5. Label en goto
  6. Verkorte ifsetor() (vanaf PHP 5.3)
  7. Static keyword (vanaf PHP 5.3?)

PHP tutorial opties

 
 

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.