php-Frage

Ein CMSimple Support Forum für deutsch sprechende Nutzer und Entwickler
Post Reply
olape
Posts: 1642
Joined: Fri Mar 13, 2015 8:47 am
Contact:

php-Frage

Post by olape » Thu Jan 07, 2021 7:41 pm

ich habe innerhalb eines Plugins eine php- Date die per includeonce eingebunden wird.

Code: Select all

$adcc_conf = $plugin_cf['adc_core'];
var_dump($adcc_conf);
....

function adcc_csp_header() {

    global $adcc_conf;
    var_dump($adcc_conf);
....
}
Das erste Dump funktioniert, ich bekomme das volle array ausgegeben.
Beim zweiten bekomme ich immer NULL.
Irgendwie steh ich auf dem Schlauch. Ich ??? :cry:

cmb
Posts: 13534
Joined: Tue Jun 21, 2011 11:04 am
Location: Mü-Sa, RLP, DE
Contact:

Re: php-Frage

Post by cmb » Thu Jan 07, 2021 10:43 pm

include_once stellt sicher, dass die Datei nur einmal eingebunden wird.
Christoph M. Becker – Plugins for CMSimple_XH

olape
Posts: 1642
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: php-Frage

Post by olape » Fri Jan 08, 2021 6:34 am

cmb wrote:
Thu Jan 07, 2021 10:43 pm
include_once stellt sicher, dass die Datei nur einmal eingebunden wird.
ja, das ist so, soll so und reicht ja auch.
Es ist ja beides innerhalb der einen Datei.

Zwischen den beiden Dumps gibt es nur noch eine Abfrage, auch auf config-Optionen, in deren Abhängigkeit die Funktion aufgerufen wird oder eben auch nicht. Soweit funktioniert das auch alles.
Nur eben in der Funktion kann ich nicht auf die config-Optionen zugreifen. Auch nicht, wenn ich

Code: Select all

global $plugin_cf;
nutze.

olape
Posts: 1642
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: php-Frage

Post by olape » Fri Jan 08, 2021 1:18 pm

mit

Code: Select all

$cf
funktioniert der Dump übrigens auch innerhalb einer Funktion.

Das Problem wird wohl grundsätzlich daran liegen, dass ADC-Core_XH ja eingebunden und ausgeführt wird, bevor XH alles fertig hat. Das war ja auch Ziel der Sache.

https://github.com/cmsimple-xh/cmsimple ... s.php#L271

Code: Select all

$cf = XH_readConfiguration();
https://github.com/cmsimple-xh/cmsimple ... .php#L1014

Code: Select all

XH_URI_Cleaning();
https://github.com/cmsimple-xh/cmsimple ... .php#L1091

Code: Select all

$plugin_cf = new XH\PluginConfig();
Ich vestehe nur nicht wirklich, warum es dann an gleicher Stelle ausserhalb eine Funktion funktioniert, innerhalb dann nicht mehr.

cmb
Posts: 13534
Joined: Tue Jun 21, 2011 11:04 am
Location: Mü-Sa, RLP, DE
Contact:

Re: php-Frage

Post by cmb » Fri Jan 08, 2021 1:48 pm

Kann es sein, dass das include in einer Funktion durchgeführt wird? Dann wird nämlich nicht in den globalen Scope, sondern eben in den Funktionsscope eingebunden, und man kann auf scheinbar globale Variablen nicht zugreifen.
Christoph M. Becker – Plugins for CMSimple_XH

olape
Posts: 1642
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: php-Frage

Post by olape » Fri Jan 08, 2021 7:20 pm

/cmsimple/cms.php
--> require_once $pth['folder']['cmsimple'] . 'seofuncs.php';
---->XH_URI_Cleaning();

/cmsimple/seofunc.php
--> innerhalb XH_URI_Cleaning()

Code: Select all

    if (is_readable($pth['folder']['plugins'] . 'adc_core/seofuncs.php')) {
        include_once $pth['folder']['plugins'] . 'adc_core/seofuncs.php';
    }
Das ist auch der Pfad der konfigurierbar werden soll, um alternative Plugins zu ermöglichen.

-->/plugins/adc_core/seofuncs.php
----> include_once($pth['folder']['plugins'] . 'adc_core/config/config.php');

Das heisst, $plugin_cf kommt hier noch nicht vom cms. Das wird erst später gesetzt.

Wie gesagt, ich kann $plugin_cf in /plugins/adc_core/seofuncs.php nutzen, nur nicht innerhalb einer Funktion.
Mit $cf geht es auch innerhalb einer Funktion. Aber das ist zu diesem Zeitpunkt eben auch schon vom System gesetzt

olape
Posts: 1642
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: php-Frage

Post by olape » Fri Jan 08, 2021 8:24 pm

OK, verstehen tu ich es immer noch nicht :cry:

Aber ich habe es jetzt ganz anders gelöst.

cmb
Posts: 13534
Joined: Tue Jun 21, 2011 11:04 am
Location: Mü-Sa, RLP, DE
Contact:

Re: php-Frage

Post by cmb » Fri Jan 08, 2021 10:23 pm

olape wrote:
Fri Jan 08, 2021 8:24 pm
OK, verstehen tu ich es immer noch nicht :cry:
Ich denke, da passiert, was bei https://3v4l.org/2bFiK passiert. Es ist eben nicht möglich, aus einer inneren Funktion auf eine lokale Variable der äußeren Funktion zuzugreifen. Würde man in outer() noch global $local deklarieren, dann ginge das (https://3v4l.org/37ujb). Aber schön ist das nicht.
Christoph M. Becker – Plugins for CMSimple_XH

olape
Posts: 1642
Joined: Fri Mar 13, 2015 8:47 am
Contact:

Re: php-Frage

Post by olape » Sat Jan 09, 2021 10:13 am

Danke für die Info. Man muss doch immer wieder was lernen.

cmb
Posts: 13534
Joined: Tue Jun 21, 2011 11:04 am
Location: Mü-Sa, RLP, DE
Contact:

Re: php-Frage

Post by cmb » Thu Jan 28, 2021 11:20 pm

olape wrote:
Sat Jan 09, 2021 10:13 am
Danke für die Info. Man muss doch immer wieder was lernen.
Grundsätzlich ja, obwohl dieses spezielle Wissen eigentlich nicht nötig ist. Am besten umschifft man solche Besonderheiten von PHP komplett, indem man letztlich leichter verständliche und besser unterstützte Konstrukte verwendet. In diesem Fall wäre es schön, wenn man auf den direkten Zugriff auf die globalen Variablen verzichten könnte (was allgemein vorteilhaft ist). Und auch solche verschachtelten includes sollte man zumindest überdenken. Möglicherweise wäre es sinnvoll, die Funktionalität von seofuncs.php als Klasse zu modellieren, und die Funktionalität von adc_core/seofuncs.php als Erweiterung dieser Klasse ("Kindklasse"). Wenn man dann den ohnehin vorhandenen Autoloader nutzt, könnte das in cms.php etwa so aussehen:

Code: Select all

if (class_exists('ADC_Core\SeoClass')) {
    (new ADC_Core\SeoClass)->execute();
} else {
    (new XH\SeoClass)->execute();
}
Christoph M. Becker – Plugins for CMSimple_XH

Post Reply