lspreee: OOP: Eigenschaft (Variable) mit Wert belegen zu Beginn

OOP: Eigenschaft(Variable) mit Wert belegen zu Beginn der Klassendefinition.
Problem mit Konstante!

Hallo Gemeinde,
bitte um Hilfe. Ich möchte meiner Eigenschaft oben einen Initialwert geben.

Dies geht:

class Test{  
  private $EndOfLine = null;  
}

Auch dies geht:

class Test{  
  private $EndOfLine = "\n";  
}

Dies jedoch nicht:
Dies geht:

class Test{  
  private $EndOfLine = chr(13).chr(10);  
}

a) Warum kann ich zu Beginn keine Konstanten auf meine Eigenschaft legen?

Da dies geht:

class Test{  
  private $EndOfLine;  
  public function __construct(){  
    $this->EndOfLine = chr(13).chr(10);  
  }  
}

... b) Wo empfiehlt es sich generell die Initialwerte zu setzen. Oben hinter die Eigenschaft oder im __construct?

Vielen Dank für Hinweise.
lSpreee

  1. Natürlich ist chr() eine Funktion.

  2. Hallo,

    Dies geht:

    class Test{

    private $EndOfLine = null;
    }

      
    ja, Initialisierung mit einer Konstanten. Das ist okay.  
      
    
    > Auch dies geht:  
    > ~~~php
    
    class Test{  
    
    >   private $EndOfLine = "\n";  
    > }
    
    

    Auch eine Initialisierung mit einer Konstanten.

    Dies jedoch nicht:
    Dies geht:

    class Test{

    private $EndOfLine = chr(13).chr(10);
    }

      
    Hier ist der Initializer keine Konstante mehr, sondern ein berechneter Ausdruck aus zwei Funktionsaufrufen und einer Stringverkettung. Hättest du den Initializer als Konstante "\r\n" notiert, wäre das in Ordnung. Die Tatsache, dass der \*Wert\* des Ausdrucks, also das Ergebnis, konstant ist, spielt hier keine Rolle; es ist formal zunächst die Ausführung von Programmcode nötig.  
      
    
    > a) Warum kann ich zu Beginn keine Konstanten auf meine Eigenschaft legen?  
      
    Kannst du doch - deinee ersten beiden Beispiele zeigen es doch.  
      
    
    > Da dies geht:  
    > ~~~php
    
    class Test{  
    
    >   private $EndOfLine;  
    >   public function __construct(){  
    >     $this->EndOfLine = chr(13).chr(10);  
    >   }  
    > }
    
    

    Ja klar, das ist aber auch keine statische Initialisierung, sondern hier wird Programmcode ausgeführt (der Konstruktor), der die Felder initialisiert. Und dieser Konstruktor wird nicht zum Scriptbeginn ausgeführt, wie die statische Initialisierung, sondern erst beim Erzeugen eines Objekts dieser Klasse.
    Innerhalb des Codes kannst du natürlich auch beliebig komplexe Ausdrücke verwenden.

    ... b) Wo empfiehlt es sich generell die Initialwerte zu setzen. Oben hinter die Eigenschaft oder im __construct?

    Kommt drauf an. ;-)

    Ciao,
     Martin

    --
    In Ägypten haben früher 150000 Leute 35 Jahre lang an einer Pyramide gearbeitet. Aber bei uns arbeiten doppelt so viele Leute doppelt so lange allein an der Baugenehmigung.
      (Dieter Nuhr, deutscher Kabarettist)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(