PHP Einstieg in OOP, public property $today = date();

smallwall

Lt. Junior Grade
Registriert
Feb. 2014
Beiträge
446
Hi, ich möchte OOP lernen und habe direkt ein Problem mit meiner ersten Klasse. Es soll das aktuelle Datum in $today geschrieben werden, aber so wie ich mir das vorstelle klappt das wohl nicht. Kann man für properties keine Funktionsaufrufe wie date() oder strtotime() benutzen? Muss ich dann erstmal Platzhalter benutzen und dann später bei der instanzierung des Objekts mit $obj->today = date(); arbeiten?

Das hier klappt schon einmal nicht.

Code:
class calendar {

  public $today = date("Y-m-d H:i:s");

}
 
Genau so ist es.
 
Was wäre denn so schlimm daran, wenn man schon in der Klasse date(); strtotime(), intval() etc benutzen könnte?
 
Was hat das mit "schlimm daran" zu tun? Es geht nicht, leb damit. Für was, denkst du, sind Konstruktoren denn da?
 
smallwall schrieb:
Was wäre denn so schlimm daran, wenn man schon in der Klasse date(); strtotime(), intval() etc benutzen könnte?
Weil Du beim anlegen der Klassenvariablen (Properties) keine Funktionen ausführen kannst. Und date() ist eine Funktion. Dafür gibts aber den Konstruktor:

PHP:
<?php
class calendar {

    public $date;

    function __construct()
    {
        $this->date = date("Y-m-d H:i:s");
    }

}

$c = new calendar();

var_dump($c->date);
 
Das ist genial und funktioniert fast als ob man die Funktionsaufrufe direkt benutzen könnte. Vielen Dank für den Hinweis :)
 
Du hast hierbei auch keine Properties vor dir, sondern stink normale Member- oder Instanzvariablen. Zuweisungen sind nur bei Konstanten und/oder statics/Klassenvariablen erlaubt.
 
Das ganze ist einfach eine Limitierung der aktuellen PHP-Engine, die Sprachdefinition würde den Code unterstützen.
Ob wir jemals Funktionen dort sehen werden, ich bezweifle es, aber in PHP 5.6 wurde da schonmal ein großer Sprung nach vorne gemacht: PHP RFC: Constant Scalar Expressions.
 
Jetzt hab ich nochmal eine Frage, wenn ich in

Code:
public function test($arg1,$arg2) {
echo($arg1);
}

$arg1 und $arg2 verwende, sollte ich dann eher $this->arg1, $this->arg2 benutzen oder nur $arg1, $arg2? Ich verstehe das $this noch nicht so ganz.
 
smallwall schrieb:
Jetzt hab ich nochmal eine Frage, wenn ich in

Code:
public function test($arg1,$arg2) {
echo($arg1);
}

$arg1 und $arg2 verwende, sollte ich dann eher $this->arg1, $this->arg2 benutzen oder nur $arg1, $arg2?

$this verwendest Du für den Klassenscope, also z.B. wenn Du eine Instanzvariable ansprichst. $arg1 und $arg2 sind Funktionsparameter, also kein $this.
 
smallwall schrieb:
$arg1 und $arg2 verwende, sollte ich dann eher $this->arg1, $this->arg2 benutzen oder nur $arg1, $arg2? Ich verstehe das $this noch nicht so ganz.

Code:
class blub {

protected x=0;
protected y=0;

public function __construct($x,$y) {
  $this->x = $x;
  $this->y = $y;
}

public function output() {
  echo $this->x;
  echo $this->y;
}
}

$objekt = new blub(12, 14);
$objekt->output();

Habe ich nicht getestet, aber Prinzip sollte deutlich sein: Jede Variable hat ein so genanntes Scope, die die direkt in der Klasse und nicht in Funktionen definiert werden, lassen sich in allen Funktionen der Klasse über $this-> nutzen, die die in den Funktionen definiert sind nur in den Funktionen. Der Konstruktor bekommt hier $x und $y übergeben, die sind nur in der Kostruktorfunktion selbst gültig, damit sie in der ganzen Klasse ansprechbar sind, schreiben wir sie in $this->x, $this->y. In der Funktion output sind sie dann ansprechbar.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben