Wann genau nimmt man in OOP Static und wann nicht.

grillfleisch

Erfahrenes Mitglied
Hallo Community,

Ich arbeite mit php5 und PDO und bin gerade dabei alles OOP zu programmieren. Dies ist mein Hobby und ich mache meine Projekte nur Privat. Was ich nur nicht genau verstehe, wann greift man zu static und benutzt die Methode.
Ich weiß, dass man damit auf eine Funktion zugreifen kann, ohne eine Klasse neu zu initialiseren. Wars das ?
PHP:
//Also statt :
$test = neu Test();
$test->testmich();

//So:
Test::testmich();



Ich weiß, dass man mit self:: auf static Methoden in der benutzten Klasse zugreift, obwohl man auch meistens $this-> nehmen kann. Ich hatte bis jetzt nur ein einzigstes mal eine Fehlermeldung, dass ich nicht auf eine static methode mit $this-> zugreifen kann, obwohl diese gar nicht als static deklariert war. Seit dem beschäftigt mich dieses Thema.

parent:: benutzt man um Zugriffe in einer Elternklasse aufzubauen, da kann ich jedoch auch $this-> nehmen.

Habe schon bei Peter Kropf und co geschaut. Aber so richtig durchschau ich das nicht. Vllt kann es mir jemand erklären, dass ich es richtig verstehen kann oder kann mir den Knoten lösen :)

Beste Grüße
Basti
 
Statische Methoden verwendet man, wenn man von der Klasse keine Instanz erstellen will. Prinzipiell gibt es keine vernünftige Begründung, static zu verwenden, es ist nur eine Abkürzung, wenn man Prozeduren oder Funktionen aus dem globalen Raum wegkapseln möchte. Ist dies der Grund, statische Methoden zu verwenden, kann man genauso gut mit Namensräumen oder anonymen Funktionen arbeiten.

Es gibt das Fabrik-Entwurfsmuster, dass eine statische Methode voraussetzt. Zudem gibt es noch das Singleton-Entwurfsmuster, welches von einigen Entwicklern als Anti-Pattern tituliert wird. Auch dieses verwendet eine statische Methode, um von einer Klasse höchstens genau eine Instanz zu erlauben.
 
In statischen Methoden kannst du natürlich nicht $this benutzen... Also theoretisch kannst du alle Methoden, die kein Objekt der Klasse benötigen, statisch machen. Wenn am Ende zuviele statische Methoden rauskommen, machst du was falsch (a la Objekt als Sammlung von Funktionen) :p Ist so eine Gefühlssache was statisch sein sollte, und was nicht.
 
Vielen Dank!
"Statische Methoden verwendet man, wenn man von der Klasse keine Instanz erstellen will."
Hat mich weitergebracht :)
 
jetzt stehe ich schon wieder auf dem Schlauch und zwar bei dieser Funktion.

class b
PHP:
public static function getAllProcesses($uid) {
  $query = "SELECT * FROM `tabelle` WHERE `owner_id`=:usrId";
  $stmt = $this->db->prepare($query);
  $stmt->bindParam(":usrId",$uid,PDO::PARAM_INT);
  $stmt->execute();
  $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
  return $result;
  }
ausführende Datei
PHP:
b::getAllProcesses($_SESSION['usr_data']['usr_id']);
Fehlermeldung: Fatal error: Using $this when not in object context

Habe dann noch etwas rumprobiert, jedoch keine neue erkenntniss.
PHP:
$stmt = parent::$DB->prepare($query);
Fehlermeldung: Fatal error: Access to undeclared static property: Pc::$DB

die Klasse b erbt von Pc, diese erbt von User und in der Userklasse befindet sich der Konstruktor:

PHP:
protected $db = null;

  public function __construct($db){
  $this-> db = $db;

  }

wie schaffe ich es, dass ich in einer static Methode auf mein Datenbankobjekt zugreifen kann?
 
So direkt gar nicht.

Das ist ja gerade der Sinn einer statischen Methode, die gehört zu keinem Objekt ihrer Klasse. Es ist praktisch eine normale Funktion außerhalb der Klasse, nur dass der Klassenname Teil des Funktionsnamen ist (und so signalisiert, dass die Klasse und die Funktion vom Sinn her etwas miteinander zu tun haben)
 
Danke,

So langsam aber sicher macht es Klick.

Ich habe es nun so verstanden, dass ich die static Funktionen zwar in den Klassen mit aufnehme, aber da nur Sachen abarbeiten lassen kann, welche nicht im Objektcontent selbst benötigt werden.

Wird schon :)
 
Ergänzung: Natürlich kann man statischen Funktionen Objekte ihrer Klasse als Parameter übergeben, damit mit denen dann etwas gemacht wird (statt mit this). Aber wenn die Funktion nur mit einem Objekt Sinn macht kann man auch gleich eine nicht-statische Funktion machen
 

Neue Beiträge

Zurück