FraFu: Klassenvariablen initialisieren

Hallo!
Warum funktioniert folgender Code nicht?

class A{
}

class B{
 protected $a=array(new A());
}

Meldung:
Parse error: syntax error, unexpected T_NEW, expecting ')' in C:\temp\test.php on line 7

mfg
  frafu

  1. Hi!

    Warum funktioniert folgender Code nicht?

    class A{
    }

    class B{
    protected $a=array(new A());
    }

    Meldung:
    Parse error: syntax error, unexpected T_NEW, expecting ')' in C:\temp\test.php on line 7

    Lies dir doch mal den Eintrag im Manual zu »new« durch. Das dürfte deine Frage beantworten:
    »To create an instance of an object, a new object must be created and assigned to a variable.«

    Grüße,
    Fabian St.

    1. Hallo!»» Hi!

      Warum funktioniert folgender Code nicht?

      class A{
      }

      class B{
      protected $a=array(new A());
      }

      Meldung:
      Parse error: syntax error, unexpected T_NEW, expecting ')' in C:\temp\test.php on line 7

      Lies dir doch mal den Eintrag im Manual zu »new« durch. Das dürfte deine Frage beantworten:
      »To create an instance of an object, a new object must be created and assigned to a variable.«

      Ich dachte das wird hier imlizit zugewiesen.
      Warum funktioniert dann aber folgender Code?

      class A{
      }

      class B{
       protected $a=null;
       public function __construct(){
        $this->a=array(new A());
       }
      }

      Der einzige Unterschied ist, dass hier die Zuweisung im Konstruktor erfolgt.

      mfg
       Franz

      1. hi,

        ieh, wozu gibt es denn einen Konstruktor? Oder besser,
        erzeuge eine private Klassenmethode, die benötigte Parameter
        initialisiert. Der Memberbereich dient lediglich zur
        Declaration von Variablen.

        Warum funktioniert folgender Code nicht?
        class A{
        }

        Wo ist der Konstruktor und was macht er?

        class B{
        protected $a=array(new A());
        }

        Wenn der Konstruktor nicht parametrisiert ist, dann
        nutze new A; (ohne Klammern).

        Parse error: syntax error, unexpected T_NEW, expecting ')' in C:\temp\test.php on line 7

        s.o.

        Kann dazu auch nur sagen:

        Lies dir doch mal den Eintrag im Manual zu »new« durch. Das dürfte deine Frage beantworten:
        »To create an instance of an object, a new object must be created and assigned to a variable.«

        Der einzige Unterschied ist, dass hier die Zuweisung im Konstruktor erfolgt.

        Eben.

        Dirk

        Franz

        1. echo $begrüßung;

          Parse error: syntax error, unexpected T_NEW, expecting ')' in C:\temp\test.php on line 7

          Kann dazu auch nur sagen:

          Lies dir doch mal den Eintrag im Manual zu »new« durch. Das dürfte deine Frage beantworten:
          »To create an instance of an object, a new object must be created and assigned to a variable.«

          Nein, das ist nicht der Grund. Und das wurde ja auch schon durch den zweiten Versuch widerlegt.

          Der einzige Unterschied ist, dass hier die Zuweisung im Konstruktor erfolgt.

          Damit kommen wir schon der Sache näher.

          Der Grund für die Fehlermeldung ist, dass zur Default-Initialisierung von Klassenvariablen nur konstante Ausdrücke verwendet werden können. Das Erzeugen eines neuen Objekts ist kein solcher. Jede Objektinstanz von B soll ja eine eigene, neue Instanz von A erhalten.[*] Dafür ist der Konstruktor vorgesehen.

          echo "$verabschiedung $name";

          [*] Wenn das natürlich nicht gewünscht ist, wäre das Singleton-Muster angebracht.

          1. Der Grund für die Fehlermeldung ist, dass zur Default-Initialisierung von Klassenvariablen nur konstante Ausdrücke verwendet werden können. Das Erzeugen eines neuen Objekts ist kein solcher. Jede Objektinstanz von B soll ja eine eigene, neue Instanz von A erhalten.[*] Dafür ist der Konstruktor vorgesehen.

            Das erklärt das Verhalten! Danke für die Erklärung!

            mfg
             Frafu

            1. die variablen werden während der übersetzung des scriptes durch den interpreter gesetzt. hier können natürlich keine aufrufe erfolgen, welche erst zur ausführungszeit möglich sind.
              oder anders: der aufruf erfolgt zur übersetzungszeit

              der konstuktor läuft zur ausführungszeit beim instantiieren des objektes ab. die compilierung ist hier natürlich schon längst abgeschlossen.
              oder anders: der aufruf erfolgt zur ausführungszeit