Zugriff auf nicht existierende Felder von Klassen?

Hallo zusammen,

im Template bin ich heute morgen auf folgendes gestoßen:


[{$category->oxcategories__oxtitle->value }]

[I]$category[/I] ist ein Objekt vom Typ [I]oxCategory[/I], [I]oxcategories__oxtitle[/I] ist ein [I]oxField[/I] Objekt. So weit, so gut.

In der Dokumentation gibt es in der Klasse aber kein Feld, dass [I]oxcategories__oxtitle[/I] heißt. Noch in einer der Elternklassen. Wo zum Teufel kommen da die Daten her? Ich habe wirklich gesucht und vorher noch einen anderen Programmierer bei uns gefragt, der aber auch nur mit den Schultern zucken konnte.

Da das Azure Theme komplett undokumentiert ist, bin ich dazu übergegangen einfach in den SourceCode zu schauen, wo die Daten herkommen bzw. was mir alles an Methoden zur Verfügung steht, was bisher deutlich besser geklappt hat, als zu versuchen, die Themelogik zu verstehen. Dieser Umstand hier stellt mich allerdings vor ein Rätzel.

[QUOTE=Anpan;139195]Wo zum Teufel kommen da die Daten her?..[/QUOTE]

Wo werden die Daten denn üblicherweise gespeichert?

Aus der Datenbank, das ist klar. Mir geht es aber darum, wie die dann in das oxField-Objekt und dieses dann in das - nicht existierende - Feld [I]oxcategories__oxtitle[/I] von [I]oxCategory[/I] reinkommen

Die Grundlagen für objektorientierte Programmierung kannst Du Dir durch Literatur und diverse Webseiten wunderbar selbst erarbeiten.

Es wird in deiner Datenbank auf die Tabelle oxcategories, auf das Feld oxtitle zugegriffen - Und genau daher, kommen deine Daten.

seufz Es ist doch in Ordnung, wenn du meine Frage nicht beantworten willst, aber Sprüche wie “Grundlagen OOP kannst du dir wunderbar selbst erarbeiten” müssen doch echt nicht sein, oder?

Ich arbeite seit etwas über ein Jahr mit OOP. Mein Arbeitskollege hat Informatik studiert und arbeitet seit dem auch seit über 5 Jahren mit OOP in verschiedensten Sprachen. Da auch er sich in diesem Fall nicht erklären konnte, wieso da eine Eigenschaft Daten enthält, obwohl sie nicht definiert ist, würde ich das mal nicht unter “Grundlagen OOP” abstempeln.

Als ich das letzte mal nachgesehen habe, greift man (in PHP) mit [I]$objekt->eigenschaft[/I] auf Eigenschaften und mit [I]$objekt->methode()[/I] auf Methoden zu. In diesem Fall gibt es die Eigenschaft im Quellcode aber nicht (auch nicht in Elternklassen), was wir uns nicht erklären können.

Kann ja sein, dass es da etwas spezielles von PHP gibt, dass wir beide nicht kennen oder dass wir da etwas übersehen haben. Das ist der aber eben genau der Grund, warum ich nachfrage und auch der Grund, warum deine Aussage nicht einmal ansatzweise hilfreich ist und äußerst arrogant klingt.

Es ist ganz einfach so dass in PHP alle Klassen dynamisch sind - das heißt Felder können einfach hinzugefügt werden. Diese ganze Magie passiert in core/oxbase.php - alle Objekte aus der DB leiten von dieser Klasse ab. Und die sorgt dafür dass alle Datenbankfelder automatisch runter gemappt werden auf Felder nach der Struktur tabellenname__feldname das sind dann alles oxFields siehe core/oxfield.php

Das ist eine Information mit der ich weitermachen kann. Mir war nicht bewusst, dass man nach Lust und Laune neue Felder zur Laufzeit erstellen kann (ich habe sowas noch nie gebraucht oder gesehen). Kurzes googeln mit deiner Info hat mich dann auf die __get() Methode gebracht, in der soweit ich das beim Überfliegen sehen konnte genau das passiert.

Vielen Dank für die Erklärung.

It’s a kind of magic: http://www.php.net/manual/de/language.oop5.overloading.php#object.get