Forum: PC-Programmierung PHP, Basis(-Klasse?) oder 'global scope Klasse'


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

PHP bietet ja die Möglichkeit, ganz Stur und Dumm (Typenlos und 
prozedural) einfach drauf los zu Schreiben, und ziemlich schnell (auch 
wenn es Murks ist) zum Ziel zu kommen: Also ganz ohne Klassen. Das wird 
gleich funktionieren, ohne dass zuerst eine 'main'-Funktion, oder eine 
Basisklasse mit Konstruktor etc. vorhanden sein muss.

Aber wo steht das dann '*drinnen*'?
Bzw. wie kann man diesen "global Über-Scope / Top-Namespace" in Klassen 
ansprechen?
Gibt es dafür ein Objekt? self::class und $this funktioniert ja nur 
innerhalb einer Klasse. --->  Cannot use "self" in the global scope.

Es geht darum dass eine Funktion, die als Parameter eine Klasse (Objekt) 
sehen will, auch vom 'global scope' aufgerufen werden kann, und in dem 
Fall dieser 'global scope' mit übergeben wird. Ich will praktisch 
"Global-Parent" übergeben. (Beim frühen Initialisieren von Debugger usw. 
Wo es zu dem Zeitpunkt noch keine Instanz einer Klasse gibt, VON der das 
laufen könnte.)

Ich habe in der Doku gesucht, etwas Gegoogelt, und diverse var_dumps() 
gemacht, aber finde das Objekt nicht. Vielleicht weiß jemand was gemeint 
ist. Geht das überhaupt?

Gruß, tsx

: Bearbeitet durch User
von Franko S. (frank_s866)


Lesenswert?

Tim S. schrieb:
> Aber wo steht das dann '*drinnen*'?
Dort (Datei) wo du es reinschreibst, ausserhalb jeglicher Klassen und 
namespacedefs also wie früher ohne OO.

> Bzw. wie kann man diesen "global Über-Scope / Top-Namespace" in Klassen
> ansprechen?
Indem du die Datei von oben vorher importierst. global ist praktisch der 
"leere Raum" wo alles anfängt.

> Gibt es dafür ein Objekt? self::class und $this funktioniert ja nur
> innerhalb einer Klasse. --->  Cannot use "self" in the global scope.
Wenn du es in eine Klasse packen willst gibts du dieser vorher einen
Namen, üblicherweise wählt man auch gleich einen Namespace.
Im Prinzip kannst du auch nur einen namespace verwenden. Ist dann so als
hättest du defines mit einem Prefix.

> Wo es zu dem Zeitpunkt noch keine Instanz einer Klasse gibt, VON der das
> laufen könnte.)
Das was du oben festgelegt hast musst du vorher auch importieren sonst
wird es nicht gefunden. Die Klasse oben kannst du dann übergeben.
Je nachdem was du da machst ist die Klasse static oder es existiert ein
Objekt davon,...

> Ich habe in der Doku gesucht, etwas Gegoogelt, und diverse var_dumps()
> gemacht, aber finde das Objekt nicht. Vielleicht weiß jemand was gemeint
> ist. Geht das überhaupt?
Das Objekt legst du selber fest das ist damit gemeint.
Global Space ist alles ausserhalb von irgendwas, praktisch der "leere 
Raum" wo du beginnst. Vielleicht ist das in der aktuellen PHP-Version 
anders und es existiert inzw. sowas wie ein default globales Object 
glaube ich aber eher nicht wenn dann vielleicht innerhalb von manchen 
Frameworks aber die nutzen eher eigene namespaces wo dann deren 
"globals" leben.

Zugriff auf globale Objekte von gewissen Kontexten (innerhalb 
Klasse/Object/namespace) heraus  nimmt man "global $foo" oder 
"$GLOBALS['foo']".
Das Object das du von dort nutzen willst muss nat. vorher schon 
existieren.

Erzeugen von Objekten aus anderen Kontexten heraus in den global space 
geht vermutlich nicht, müsste man ausprobieren, ich vermute mal die def 
ausserhalb muss vermutlich schon vorher vorhanden sein, so Art leeres 
Object.

: Bearbeitet durch User
von Tim S. (Firma: tsx89) (freak_ts) Benutzerseite


Lesenswert?

Joa alles klar. Danke für die Hinweise und Infos.

Franko S. schrieb:
> Global Space ist alles ausserhalb von irgendwas, praktisch der "leere
> Raum" wo du beginnst.

--> Da bleibt nur noch "null", anstelle einer Klasse oder Type, zum 
übergeben. Es muss dann "eigen behandelt" werden, was ich mir sparen 
wollte. Wegen erst auf null Prüfen, etc. ... Danke soweit!

von Franko S. (frank_s866)


Lesenswert?

Tim S. schrieb:
> --> Da bleibt nur noch "null", anstelle einer Klasse oder Type, zum
> übergeben. Es muss dann "eigen behandelt" werden, was ich mir sparen
> wollte. Wegen erst auf null Prüfen, etc. ... Danke soweit!

Bei den namespaces gibts auch global, wenn man den Bezeichner weglässt:

namespace {
  //deklarationen
}
Da liegt dann alles in global (bei ns bezieht sich das immer auf const, 
Klassen und Funktionen).

Den jeweiligen namespace kannst du mit _NAMESPACE_ erfragen, 
vielleicht
hilft dir das weiter.

Lies dir mal
https://www.php.net/manual/en/language.namespaces.php
durch da steht das alles erklärt auch die Kommentare wo sich manches 
anders verhält als man es vermutet.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.