Hallo,
Bij PDO heb je een soort publieke static constante. Bijvoorbeeld

$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );

Als ik een public static constant maak, doe ik het zo:

class Example {
    public static const $NUMBER_ONE = 1;
}
$one = Example::$NUMBER_ONE;

Let op het dollarteken op lijn 4 van mijn voorbeeld. Bij PDO is dit niet. Is dat omdat de PDO constante eigenlijk geen variabele is, maar een methode? Hoe zit dit, want ik vind het verwarrend. Daarbij kun je in php volgens mij geen methode aanroepen zonder de haakjes erachter.
Werkt dat zo? Dan heb ik namelijk nog wat te leren, ik krijg een foutmelding.

Maar een constante is per definitie al publiek (je kan geen private of protected constantes maken) en in feite zijn ze ook al altijd static. Dus beide keywords zijn niet nodig. Een class constante kan je gewoon zo definieren en gebruiken:

<?php
class Example {
    const NUMBER_ONE = 1;
}
$one = Example::NUMBER_ONE; 
?>
In PHP heb je 2 dingen: Variabelen en constanten.

Variabelen hebben een variabele waarde. Je kan ze in het begin op "hello" zetten en halverwege op "world":
<?php
$a = 'hello';
$a = 'world';
?>

Constanten hebben een constante waarde. Deze kun je maar 1 keer instellen en daarna hebben ze altijd deze waarde:
<?php
define('A', 'hello');

define('A', 'world'); // error
?>

Variabelen worden in PHP gekenmerkt door dat ze een $ voor de naam hebben. Constanten hebben dit niet, dan heb je gewoon de naam.

Met het const keyword kun je class constanten aanmaken. Dat is gewoon hetzelfde als globale constanten, alleen zijn ze dan binnen een class gedefinieerd.

In tegenstelling tot variabelen kunnen constanten alleen publiek zijn.

Het woordje static geeft aan dat iets onderdeel is van de klasse, niet van de instance van de klasse. Als je een normale property $a zou hebben in een klasse dan is deze afhankelijk van de instance van die klasse:
<?php
class Foo
{
public $a = 'hello';
}

$instance1 = new Foo();
$instance2 = new Foo();

$instance1->a = 'world';

echo $instance1->a; // "world"
echo $instance2->a; // "hello", dit is namelijk de $a property van een andere instance
?>

Bij static zijn deze niet afhankelijk van de instance:
<?php
class Foo
{
public static $a = 'hello';
}

$instance1 = new Foo();
$instance2 = new Foo();

$instance1::$a = 'world';

echo $instance1::$a; // "world"
echo $instance2::$a; // "world", het is immers dezelfde klasse
?>

Een constante kan maar 1 waarde hebben en die waarde wordt meegegeven wanneer we hem definiƫren. Hierdoor is het altijd static, hij kan niet afhangen van de instance omdat hij per klasse definitie altijd dezelfde is.
Mooi uitgelegd Wouter.

Reageren