Jens: OOP in PHP: __construct verstehen

Hallo,

wollte mich mal mit OOP beschäftigen, scheitere aber schon an so einfachen Dingen wie dem folgenden Code:

<?php
class User{
	public function __construct()	{
	  $this['data']->GetUserPersonData();
    $this['userMenuItems']->GetUserMenuItems( $this['data']['id'] );
	}
	
	private function GetUserPersonData() { # hier lese ich anhand des Loginnamens das ActiveDirectory aus}
	private function GetUserMenuItems( $userId ) {}
}
?>

Da erhalte ich ein Fatal error: Uncaught Error: Cannot use object of type User as array und weiß nicht, was ich falsch mache/ falsch verstanden habe.

Ich möchte beim Aufruf von $user = new User(); im Hauptprogramm einen Nutzer erstellen, der schon vorbelegte Inhalte hat.

Der $user soll so 'aussehen':

$user['data']['id']

$user['data']['email']

$user['data']['name']

Was mache ich falsch bzw sollte ich mir in einem Tutorial genauer ansehen/ nach welchem stichwort googlen?

Anmerkung: Bei prozeduraler Programmierung habe ich kein Problem bei der Zuweisung. Was ich damit sagen will, der Code in den Functions ist korrekt.

Vielen Dank und voab schon mal ein schönes Wochenende!

  1. Tach!

    Da erhalte ich ein Fatal error: Uncaught Error: Cannot use object of type User as array und weiß nicht, was ich falsch mache/ falsch verstanden habe.

    Handbuch nicht gelesen? Das was du geschrieben hast, funktioniert bei Javascript, aber PHP verwendet die ->-Syntax für den Zugriff auf Mitglieder.

    dedlfix.

    1. Hatte auch $this->data->GetUserPersonData(); und $this->['data']->GetUserPersonData(); probiert, aber beides führt zu Fehlern :(

      1. Hatte auch $this->data->GetUserPersonData(); und $this->['data']->GetUserPersonData(); probiert, aber beides führt zu Fehlern :(

        Kein Wunder. Wenn Du:

        $this -> data = $this -> GetUserPersonData();
        

        willst. Dann solltest Du das auch so notieren.

        1. Oh, wunderbar. Das klappt. Vielen, vielen Dank! Macht es Sinn dies noch mit in den Code aufzunehmen (vor dem '__construct' )?

          private $data = array();

          1. Macht es Sinn dies noch mit in den Code aufzunehmen (vor dem '__construct' )?

            private $data = array();
            

            Nein. Weil es im Deklarationsteil nicht erlaubt ist und ergo zu einer Fehlermeldung führen wird.

            Aber:

            private $data;
            

            oder

            private $data = [];
            

            sollte funktionieren.

            1. Auch hier noch mal ein DANKE.

              Einen Fehler produziert private $data = array(); ( zumindest bei mir ) nicht, werde es dann aber so machen, wie von dir geschrieben.

              1. Tach!

                Einen Fehler produziert private $data = array(); ( zumindest bei mir ) nicht, werde es dann aber so machen, wie von dir geschrieben.

                Wenn ich mich recht erinnere, ist das mal hinzugefügt worden, dass man nicht nur Konstanten sondern auch solche zu berechnenden Ausdrücke angeben kann. Andererseits ist array() auch keine Funktion, sondern ein Sprachkonstrukt. Das wird also auch nicht wie eine herkömmliche Funktion erst zur Laufzeit aufgerufen, sondern schon vom Compiler ausgewertet.

                dedlfix.

                1. Hallo dedlfix,

                  gerade mal im Sandkasten gespielt - Angabe eines Array als Initializer einer private-Variablen geht seit PHP 5.0. Ok, vielleicht auch schon in PHP 4, aber da habe ich die Klassen-Syntax nicht mehr drauf und hatte keine Lust, archäologisch aktiv zu sein.

                  Verwendung von arithmetischen Ausdrücken im Initializer geht seit PHP 5.6.

                  Rolf

                  --
                  sumpsi - posui - clusi
                  1. Ja. Ihr habt recht.

                    Das $foo=array() im Initialisierungsteil einer Klasse zu einem Fehler führt ist nicht richtig.

                    Ich wende zu meiner Entschuldigung ein, dass ich mir einfach mal nicht gemerkt habe, was GENAU bei der Initialisierung eines Objektes ab welcher Version von PHP geht oder nicht. Insbesondere im Hinblick darauf, dass es Sonderfälle wie array() gibt, die in der Dokumentation unter „Funktion“ geführt werden, auch genau so notiert werden - und dann gar keine sind…

                    Ich habe mir der Einfachheit wegen gesagt und gemerkt:

                    • Konstante Wertzuweisung ohne irgendwelche Funktionen oder Berechnungen geht immer.
                    • Die Bestimmung, ob Eigenschaft public oder private sein soll, soll sein und geht immer.
                    • Für alles andere gibt es __construct().
                    • „Fertig“.
                    1. Hallo Regina,

                      und es ist auch gut so, sich das so zu merken. Nicht jedes Sprachkonstrukt trägt zur Lesbarkeit bei.

                      Performancetechnisch dürfte es keinen Unterschied machen, ob ich eine Inline-Initialisierung mache oder das in den Konstruktor tippe.

                      Der Konstruktor hat den Vorteil, dass alles beisammen ist und sich nicht irgendwo in der Klasse eine Extra-Initialisierung versteckt.

                      Rolf

                      --
                      sumpsi - posui - clusi
      2. Tach!

        Hatte auch $this->data->GetUserPersonData(); und $this->['data']->GetUserPersonData(); probiert, aber beides führt zu Fehlern :(

        Der Fehlermeldungstext ist nicht nur zur Zierde da und fällt auch nicht unter die DSGVO. Du darfst den zeigen, damit man was draus entnehmen kann. Ich rate, dass wohl keine Eigenschaft data existiert und der Zugriff auf Dinge davon natürlich fehlschlägt.

        dedlfix.

  2. Lieber Jens,

    Deine Klasse definiert ein Objekt mit Methoden, aber ohne Eigenschaften.

    Der $user soll so 'aussehen':
    $user['data']['id']
    $user['data']['email']
    $user['data']['name']

    Du notierst hier anscheinend ein assoziatives Array. Willst Du das auch so? Das ginge so:

    class User {
    
      private $data = array (
        'id' => '',
        'email' => '',
        'name' => ''
      );
    
      public  function __construct ()	{ ... }
      private function GetUserPersonData () { ... }
      private function GetUserMenuItems ( $userId ) { ... }
    }
    

    Ich möchte beim Aufruf von $user = new User(); im Hauptprogramm einen Nutzer erstellen, der schon vorbelegte Inhalte hat.

    class User {
    
      private $data = array (
        'id' => uniqid('user_', true),
        'email' => '',
        'name' => ''
      );
    
      public  function __construct ($params)	{
    
        // copy values into $this->data
        if (!empty($params) && is_array($params)) {
    
          foreach (array_keys($this->data) as $key) {
            // exclude 'id' since it must be unique
            if ($key != 'id' && array_key_exists($key, $params)) {
              $this->data[$key] = $params[$key];
            }
          }
        }
      }
      ...
    }
    
    $user = new User(array(
      'email' => 'user@example.org',
      'name' => 'Fiffy the Great'
    ));
    

    Liebe Grüße,

    Felix Riesterer.