PHP Opérateurs d'objets et de classes


Exemple

Les membres des objets ou des classes peuvent être accédés en utilisant l'opérateur d'objet ( -> ) et l'opérateur de classe ( :: .

class MyClass {
    public $a = 1;
    public static $b = 2;
    const C = 3;
    public function d() { return 4; }
    public static function e() { return 5; }
}

$object = new MyClass();
var_dump($object->a);   // int(1)
var_dump($object::$b);  // int(2)
var_dump($object::C);   // int(3)
var_dump(MyClass::$b);  // int(2)
var_dump(MyClass::C);   // int(3)
var_dump($object->d()); // int(4)
var_dump($object::d()); // int(4)
var_dump(MyClass::e()); // int(5)
$classname = "MyClass";
var_dump($classname::e()); // also works! int(5)

Notez qu'après l'opérateur de l'objet, le $ ne doit pas être écrit ( $object->a au lieu de $object->$a ). Pour l'opérateur de classe, ce n'est pas le cas et le $ est nécessaire. Pour une constante définie dans la classe, le $ n'est jamais utilisé.

Notez également que var_dump(MyClass::d()); n'est autorisé que si la fonction d() ne fait pas référence à l'objet:

class MyClass {
    private $a = 1;
    public function d() {
        return $this->a;
    }
}

$object = new MyClass();
var_dump(MyClass::d());   // Error!

Cela provoque une erreur PHP fatale: erreur non détectée: utilisation de $ this lorsque le contexte de l'objet n'est pas atteint

Ces opérateurs ont laissé une associativité, qui peut être utilisée pour «chaîner»:

class MyClass {
    private $a = 1;
    
    public function add(int $a) {
        $this->a += $a;
        return $this;
    }
    
    public function get() {
        return $this->a;
    }
}

$object = new MyClass();
var_dump($object->add(4)->get());  // int(5)

Ces opérateurs ont la priorité la plus élevée (ils ne sont même pas mentionnés dans le manuel), encore plus que le clone . Ainsi:

class MyClass {
    private $a = 0;
    public function add(int $a) {
        $this->a += $a;
        return $this;
    }
    public function get() {
        return $this->a;
    }
}

$o1 = new MyClass();
$o2 = clone $o1->add(2);
var_dump($o1->get()); // int(2)
var_dump($o2->get()); // int(2)

La valeur de $o1 est ajoutée avant que l'objet ne soit cloné!

Notez que l'utilisation de parenthèses pour influencer la préséance ne fonctionnait pas dans PHP version 5 et antérieure (c'est le cas en PHP 7):

// using the class MyClass from the previous code
$o1 = new MyClass();
$o2 = (clone $o1)->add(2);  // Error in PHP 5 and before, fine in PHP 7
var_dump($o1->get()); // int(0) in PHP 7
var_dump($o2->get()); // int(2) in PHP 7