1unitedpower: assoziative Werte mit __set() und Index in numerisches array einfügen?

Beitrag lesen

class FooBar {

    private $fuz;
    private $baz;

    public function __get( string $property ) {
        return $this->$property;
    }
    
    public function __set( string $property, $value ) {
        if( $property === 'fuz' and is_string( $value ) ) { 
            $this->fuz = $value;
        }
        if( $property === 'baz' and is_array( $value ) ) { 
            $this->baz = $value;
        }
    }
}

Das ist natürlich wirklich sehr kurz, aber damit erkaufst du dir auch ein paar Nachteile: Die Autovervollständigung von Editoren leidet darunter, wenn Typ-Informationen, sowie hier, erst zur Laufzeit bekannt werden. Das selbe gilt für Code-Qualitäts-Tools, die auf statische Typ-Informationen angewiesen sind und letztlich erschwerst du dir selber das Unit-Testing, wenn du es denn benutzt. Wenn es etwas länger sein darf, aber ohne die genannten Nachteile, dann würde ich es so schreiben:

class FooBar {

    private $fuz;

    private $baz;

    public function setFuz(string $fuz) {
        $this->fuz = $fuz;
    }

    public function getFuz() : string {
        return $this->fuz;
    }

    public function setBar(array $bar) {
        $this->bar = $bar;
    }

    public function getBar() : array {
        return $this->bar;
    }
}

Oder, du benutzt PHPDoc-Annotationen, damit wird der Code sogar noch kürzer als deine ursprüngliche Fassung und viele Programme können damit umgehen:

class FooBar {

    /**
     * @var string
     */
    public $fuz;

    /**
     * @var array
     */
    private $baz;
}