Hi,


Wie kan mij uitleggen wat nu het verschil is tussen public, private en protected in een PHP class?
Hoe en wanneer gebruik je welke als je een class gaat programmeren.

gr. Sebastiaan
PHP 8 heeft een nieuwe feature die constructor property promotion wordt genoemd. Hiermee kun je, zoals de naam eigenlijk al zegt, parameters in de constructor promoveren tot eigenschappen.

PHP 7:

<?php
class User
{
    private string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
}
?>


PHP 8:

<?php
class User
{
    public function __construct(private string $name) {}
}
?>
Wat is daar het doel en/of voordeel van?
Het doel is herhalingen voorkomen en de syntaxis van met name value objects vereenvoudigen:

The properties are repeated 1) in the property declaration, 2) the constructor parameters, and 3) two times in the property assignment. Additionally, the property type is repeated twice.

Especially for value objects, which commonly do not contain anything more than property declarations and a constructor, this results in a lot of boilerplate, and makes changes more complicated and error prone.

This RFC proposes to introduce a short hand syntax, which allows combining the definition of properties and the constructor.
Begrijp ik dat je de property dan niet meer kunt bewerken en valideren, maar dat die direct wordt toegewezen?

<?php
class User
{
public function __construct(private string $name) {}
}
?>
Je kunt de validatie inbouwen of aanroepen in de constructor:


<?php
class User
{
    public function __construct(private string $name)
    {
        if (!\is_string($name) || empty($name)) {
            throw new \InvalidArgumentException();
        }
    }
}
?>


Daarnaast is er veel voor te zeggen om die validatie (overeenkomstig het single-responsibility principle) niet in te bouwen in het value object zelf maar te delegeren aan een aparte validator.
Oké, thanks. Ben wel benieuwd of dit straks vaak toegepast gaat worden. Het lijkt me (soms) onhandig om alle properties mee te geven aan een constructor.

Maar stel dat je wel een id meegeeft aan de constructor, dan krijg je dus zo'n soort class?

<?php
class User
{

private $age
private $gender
private $name

public function __construct(private int $id) {}

public function getName() {
return $this->name;
}

public function setName($name) {
$this->name = $name;
}

// overige methods

}
?>
Als ik nu die class bekijk, zie ik niet in één oogopslag dat er een propterty 'id' bestaat.
Je moet ook niet in een class kijken: je kijkt naar de public interfaces, waaronder de constructor om een object te creëren.
Ja, daar heb je een punt. Haha. Maar ben toch benieuwd hoe dit in de praktijk uitpakt. Van de ene kant wel mooi, maar van de andere kant zie je nu de property niet meer bovenin staan. Da's wel apart.
In PHP 7 kun je ook al in de signatures van methoden expressiever uitdrukken hoe een class moet worden gebruikt. Ingekort bijvoorbeeld:


<?php
class User
{
    public function __construct(int $id)
    {
        // ...
    }

    public function getName(): string
    {
        // ...
    }

    public function setName(string $name): void
    {
        // ...
    }
}
?>

Reageren