woher kennt meine eigene php Datei die Datei mit der Elternklasse?

  • Hallo Ihr Wissenden,

    ich habe mal eine Grundsätzliche Frage. Die möchte ich mal am Beispiel eines Plugin darstellen. Ich habe unter anderem eine php Datei.
    der Inhalt ist ja im Prinzip so:

    PHP
    <?php
    defined('_JEXEC') or die;
    class PlgContentCoordstomap extends JPlugin 
    {
        //weiterer Code
    }
    ?>

    Woher weiß meine Datei wo sie JPlugin zu finden hat? Und das ohne

    Code
    require_once ('irgendwas.php');

    Danke in Vorraus

  • Das ist Joomla-Magie. Die Klasse wird automatisch von Joomla geladen. Ab Joomlaversion 3.???


    Seit Joomla 3.9 macht man das übrigens etwas moderner, indem man Namespace-Deklarationen verwendet, und ist dann kompatibler zu kommenden Joomla-Versionen.


    Direkt hinter

    Code
    defined('_JEXEC') or die;

    fügst du ein

    Code
    use Joomla\CMS\Plugin\CMSPlugin;

    und dann

    Code
    class PlgContentCoordstomap extends CMSPlugin


    EDIT: Der Vollständigkeit halber: Und gaaaaaaaanz früher hat man für dein ANliegen verwendet:

    Code
    jimport('joomla.plugin.plugin');
  • Danke für dein Antwort aber leider bin ich jetzt noch mehr verwirrter ;)


    auch bei Namensspace würde es doch so aussehen

    und dann

    PHP
    <?php
    require_once 'reisebuero.php';
     
    $reise1 = new Reisebuero\Reise();
    echo Reisebuero\tue_was();
    ?>
  • Viele Wege führen nach Rom.


    Meine Antwort bezieht sich auf Joomla-Plugins und deine Frage

    Woher weiß meine Datei wo sie JPlugin zu finden hat?

    , die ja Joomla-Plugin-Code zeigt. Joomla hat diverse praktische Klassen dabei und Namespaces bzw. verwendbare "Wege zu Klassen" bzw. Klassen wie "JPlugin" schon integriert, vorbereitet, schon "geladen", die man direkt verwenden kann. Das zeige ich in meinen ersten beiden Codes.


    Andere "Wege zu eigenen Klassen" musst natürlich selbst definieren. Das hängt ja auch von der Einsatzart ab.


    Dein nächster Code zeigt dann eine Datei mit mehreren Klassen. Unüblich in Joomla. Verwirrt mich jetzt also. Keine Ahnung auf was du eigentlich generell hinaus willst. Natürlich kannst auch "normales PHP" wie require in Joomla verwenden. require hat aber ggf. Nachteile bzgl. Performance.


    Statt require oder include, die ja die genannte Datei sofort kompllett laden, verwende ich in Joomla meist den JLoader für meine eigenen Klassen, weil ich mit Namespaces noch nicht so firm bin.


    Ein Beispiel aus dem Joomla-Core:


    Ein Plugin möchte die Klasse, die in der Pfadangabe steht, verwenden und bereitet die Geschichte so vor:

    https://github.com/joomla/joom…xtd/fields/fields.php#L45


    Das ist die Klasse

    https://github.com/joomla/joom…fields/helpers/fields.php

    die dann mit dem Alias "FieldsHelper" angesprochen werden kann:


    Paar Zeilen später verwendet das Plugin dann eine Methode aus der o.g. Klasse

    https://github.com/joomla/joom…xtd/fields/fields.php#L53


    Vorteil des "register(...)" ist, dass die Klasse "FieldsHelper" nur auf "verfügbar" gesetzt wird, aber erst geladen wird, wenn sie dann wirklich benötigt wird. "Joomla weiß schon mal, wo sie ist".


    Ebenso, wenn man die Namespaces mit "use" nutzt. Erst mal nur "bekannt gemacht, dass ich vielleicht später nutzen könnte".


    Nach meiner Denke kannst Zeile

    https://github.com/joomla/joom…xtd/fields/fields.php#L45


    auch am Anfang deiner Klasse verwenden und die dann extenden:

    Code
    class meineKlasse extends FieldsHelper
    {
    
    }


    Nachtrag: In Joomla 3 sind die Namespaces noch nicht zu 100% angewendet, aber hier habe ich ein hübsches Beispiel gefunden, wo alles Gesagte verwendet wird, auch das extenden einer Klasse mit einer, die per JLoader vorbereitet wurde:


    https://github.com/joomla/joom…joomla/joomla.php#L12-L25


    In Joomla 4 ist das schon weiter verbreitet, sozusagen. Seit Joomla 3.9 kann man bereits vieles aus Joomla 4 abspicken und in J3 verwenden. Nicht alles.


    Noch mal: Viele Wege führen nach Rom.

  • Relevant ist an der Stelle glaub ich, dass Joomla! den Namespace automatisch in einen Dateipfad umwandelt und von sich aus die Dateien per include/require einbindet. Deshalb musst du das in deinem Plugin nicht mehr selbst machen.


    Joomla! bringt einen autoload-Mechanismus mit, der, wenn du irgendwo eine Klasse einbindest, automatisch nach der passenden Datei sucht und diese einbindet. Je nachdem, wie dein Projekt strukturiert ist, geht das über erwähnte Namespaces, oder wie man es davor gemacht hat, indem man dem (J)Loader über die Methoden `register` und `registerPrefix` gesagt hat: "Hey, falls du Klasse XY suchst, die ist in der Datei plugins/.../plg_meinplugin/xy.php definiert."


    Und bei Klassen, die im J!-Core drin sind, ist das alles schon erledigt. Deshalb brauchst du dich selbst nicht um require oder include zu kümmern. Wenn eine deiner Klassen nicht gefunden wird, musst du dann dementsprechend entweder die Namespace-Struktur anpassen (neue, saubere Methode) oder sie per `JLoader::register` anmelden (alte, unstrukturierte Methode).

  • ...Woher weiß meine Datei wo sie JPlugin zu finden hat? ...

    Ist zwar ein schon sehr alter Thread aber ich ergänze mal trotzdem:


    Code
    JLoader::registerAlias('JPlugin', '\\Joomla\\CMS\\Plugin\\CMSPlugin', '5.0');

    aus:

    github.com/joomla/joomla-cms/blob/3.10.12/libraries/classmap.php#L133

  • Ja, in Joomla! 5 benötigt man daher diesbezüglich z. B. zur Weiterbenutzung von JPlugin usw. das aktivierte Rückwärtskompatibilitäts-Plugin.


    Für diejenigen welche es im Code von Joomla! 5 sehen möchten und nicht wissen wo es ist siehe z.B auch.:


    github.com/joomla/joomla-cms/blob/5.0.1/plugins/behaviour/compat/src/classmap/classmap.php#L124