Hackerboard WikiHaboBlog

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Statischen Aufruf erkennen

Diskussion: Statischen Aufruf erkennen im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Moinsen! Gibt es in PHP die Möglichkeit zu erkennen ob die Methode einer Klasse statisch oder über ein Objekt aufgerufen ...

Antwort
Alt 25.06.10, 22:20   #1 (permalink)
Member of Honour
 
Benutzerbild von Brabax
 
Registriert seit: 04.10.01
Brabax Leistung: 8086Brabax Leistung: 8086
Brabax eine Nachricht über ICQ schicken
Likes: 34
Standard Statischen Aufruf erkennen


Moinsen!

Gibt es in PHP die Möglichkeit zu erkennen ob die Methode einer Klasse statisch oder über ein Objekt aufgerufen wurde?

Könnte man das überprüfen in dem man schaut ob eine Eigenschaft gesetzt wurde im Sinne von isset($this->Eigenschaft), oder gibt es da einen besseren Weg?

lG

Brabax

__________________

<< Wir leben bereits im morgigen Gestern, doch vom gestrigen Morgen sind wir noch weit entfernt. >>

<< Träume sind Schäume. Es liegt an dir ob du sie lebst oder ein Schaumschläger bist! >>

<< Erst wenn man beginnt zu implizieren, wird man merken, dass einem sowieso keiner richtig zuhört. >>
Brabax ist offline   Mit Zitat antworten
Alt 25.06.10, 22:50   #2 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

Nicht wirklich. Aber du kannst prüfen, ob die Methode in einem statischen Kontext ausgeführt wird oder nicht.

PHP-Code:
<?php

class Foo
{
    public static function 
static_function() {
        
$isStatic = !(isset($this) && get_class($this) == __CLASS__)
        echo 
var_dump($isStatic);
    }
    
    public function 
non_static_function() {
        
$isStatic = !(isset($this) && get_class($this) == __CLASS__)
        echo 
var_dump($isStatic);
    }
}

$foo = new Foo();
$foo->static_function();
$foo->non_static_function();

Foo::static_function();
Foo::non_static_function();

?>
Thunderb0lt ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 25.06.10, 22:54   #3 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von Brabax
 
Registriert seit: 04.10.01
Brabax Leistung: 8086Brabax Leistung: 8086
Brabax eine Nachricht über ICQ schicken
Likes: 34
Standard

Danke
__________________

<< Wir leben bereits im morgigen Gestern, doch vom gestrigen Morgen sind wir noch weit entfernt. >>

<< Träume sind Schäume. Es liegt an dir ob du sie lebst oder ein Schaumschläger bist! >>

<< Erst wenn man beginnt zu implizieren, wird man merken, dass einem sowieso keiner richtig zuhört. >>
Brabax ist offline   Mit Zitat antworten
Alt 25.06.10, 22:56   #4 (permalink)
Senior Member
 
Benutzerbild von odigo
 
Registriert seit: 25.12.04
odigo Leistung: 8086odigo Leistung: 8086
odigo eine Nachricht über ICQ schicken
Likes: 50
Standard

Also ich kenn mich mit OOP in PHP null aus. Ich versuchs mal mit OOP-Theorie: Du könntest doch einen Standardconstructor in der Klasse definieren der ein Flag setzt. Ist das Flag nicht gesetzt muss es wohl ein static-Aufruf gewesen sein.

Für was will man sowas eigentlich wissen, wenn ich fragen darf?
odigo ist gerade online   Mit Zitat antworten
Alt 25.06.10, 23:10   #5 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 191
Standard

$this ist nicht gesetzt falls der aufruf ohne ein bezugsobjekt erfolgt ist ...

das ganze oo konzept von php ist sowieso käse ...

php unterscheidet nur zwischen einem objektbezogenen aufruf, und einem nicht objekt bezogenen aufruf ... der witz daran: das objekt auf das sich der aufruf bezieht muss nicht zur klasse gehören in der die funktion deffiniert wurde ...
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 25.06.10, 23:14   #6 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von Brabax
 
Registriert seit: 04.10.01
Brabax Leistung: 8086Brabax Leistung: 8086
Brabax eine Nachricht über ICQ schicken
Likes: 34
Standard

Ich war vorhin am Programmieren und war gerade dabei eine Methode zu entwickeln, die sich sowohl als statische als auch als Objektmethode anbot. Über ein Objekt, war das Argument für die Methode bereits vorher als Eigenschaft festgelegt und bei einem statischen Aufruf hätte man eben die Möglichkeit gehabt, eine Alternative für das Argument zu liefern.

Da ich zu faul war diese Methode zweimal zu schreiben, habe ich mir überlegt, ob das wohl funktioniert und bin dann bei Google leider nicht schlau geworden.

Im Endeffekt habe ich mich entschlossen, dass ich einen statischen Aufruf einfach ausschließe (wäre quasi nur ein unsauberes Komfort-Ding für faule Brabaxen gewesen), aber die Frage hat mich halt trotzdem beschäftigt, gerade weil PHP ja oftmals sehr viel Freiraum bietet, die Programmiersprache nach Belieben zu misshandeln.

Ist in diesem Sinne dann auch mehr theoretischer Natur.

lG

Brabax

Edit:

Zitat:
das ganze oo konzept von php ist sowieso käse ...
Dient imo wahrscheinlich auch nur der besseren Strukturierung
__________________

<< Wir leben bereits im morgigen Gestern, doch vom gestrigen Morgen sind wir noch weit entfernt. >>

<< Träume sind Schäume. Es liegt an dir ob du sie lebst oder ein Schaumschläger bist! >>

<< Erst wenn man beginnt zu implizieren, wird man merken, dass einem sowieso keiner richtig zuhört. >>
Brabax ist offline   Mit Zitat antworten
Alt 26.06.10, 03:53   #7 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 191
Standard

Zitat:
Zitat von Brabax Beitrag anzeigen
Dient imo wahrscheinlich auch nur der besseren Strukturierung
PHP-Code:
class Foo
{

    public function 
upsi()
    {
        echo 
var_dump($this);
        echo 
"\n";
    }

}

class 
Bar
{

    public function 
whoopsi()
    {
        
Foo::upsi();
    }

}


Foo::upsi();
Bar::whoopsi();
$foo=new Foo;
$bar=new Bar;

$foo->upsi();
$bar->whoopsi(); 
ausgabe:
Code:
NULL

NULL

object(Foo)#1 (0) {
}

object(Bar)#2 (0) {
}
wieviel struktur steckt darin?

die "this" referenz zeigt auf den objektbezug ... ist dieser nicht gegeben, zeigt sie auf NULL (ist eigentlich nicht existent, aber in php hat ja so ziemlich alles einen wert ... es muss nichtmal existieren...)

was daran so schwer sein soll statische member sichtbarkeit von instanz member sichtbarkeit zu trennen weiß ich nicht ...

was mir allerdings schwerer im magen liegt, ist die tatsache, dass es möglich ist einer methode etwas im objekt-kontext unterzujubeln, das nichtmal zu ihrer klasse gehört ... aber es ist eben nur ein objekt kontext ... niemand sprach von einem instanz bezogenen kontext ...

ich habe versucht darin struktur zu suchen ... ich finde keine ... was bringt ein oo konzept, wenn es nicht mal den hauch von typisierung gibt? ... ja, toll, ich kann dinge vererben ... man kann einen hauch von polymorphie damit erzeugen, aber eine methode kann sich nicht darauf verlassen, dass sie nur auf instanzen ihrer klasse ausgeführt wird...

bitte entschuldigt mich nun, ich beiß an dieser stelle mal in die tischkante oder so ...
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 26.06.10, 09:35   #8 (permalink)
 
Benutzerbild von benediktibk
 
Registriert seit: 03.05.07
benediktibk Leistung: 8086
Likes: 17
Standard

Sorry, ich habe keine Ahnung von PHP, aber: Wird da wirklich upsi mit einer Instanz auf Bar (als this) ausgeführt?
Ultimate Fail!
benediktibk ist offline   Mit Zitat antworten
Alt 26.06.10, 12:15   #9 (permalink)
 
Benutzerbild von metax.
 
Registriert seit: 22.01.07
metax. Leistung: 8086
metax. eine Nachricht über ICQ schicken
Likes: 10
Standard

Klar, hier ist PHP ziemlich unsauber (wie auch in vielen anderen Bereichen).
Aber ich sehe nicht, wo dein Problem ist, wenn du statische Methoden immer statisch aufrufst (ohne einen Bezug auf $this) und nichtstatische Methoden immer über den -> Operator (und nicht mit dem Paamayim Nekudotayim Operator).
Ich behaupte mal, wenn man es nicht darauf anlegt, verhält sich OOP in PHP auch nicht so ungewöhnlich ...
__________________
Wenn keiner zuschaut, teile ich heimlich durch Null!
Meine Homepage: Planet Metax | meine Bilder: DeviantArt | Twitter
metax. ist offline   Mit Zitat antworten
Alt 27.06.10, 05:29   #10 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 191
Standard

wenn man sich von vorne herein daran hält, mag man diesen und andere makel ignorieren können, aber sinn und zweck von kapselung ist beispielsweise bestimmte zugriffspfade einzuhalten ...

php verfolgt an dieser stelle das motto, "wir haben zwar einen tresor für wertvolle dinge, aber der ist grundsätzlich nicht abgeschlossen und sperrangelweit offen, weil diebstahl ja verboten ist ..."

das man im zweifel überall dran kommt, ist klar ...
das man sich an bestimmte regeln bei der entwicklung halten sollte ist auch klar ...

aber php führt das ganze ad absurdum, wenn nichtmal das sprachkonstrukt eine grundlegende trennung zwischen klassen hinbekommt ... ducktyping hin oder her, ein objekt sollte seine methoden kennen, eine methode sollte die klasse des objekts kennen auf dem sie opperiert, und es macht mal so überhaupt keinen sinn aus oo sicht wenn eine nicht statische methode einer klasse mit einem objekt aufgerufen wird, wohlgemerkt nicht als parameter sondern als verweis auf das objekt in dessen kontext die methode aufgerufen wurde, das einer völlig anderen klasse angehört, die keinerlei vererbungsbeziehung zur deffinierenden klasse hat.

im übrigen scheint es php reichlich egal zu sein, wie die sichtbarkeit der methode deffiniert wurde ...

in meinem beispiel als "public function" ist die methode als nicht statisch deklariert

aus kompatiblitätsgründen mit php4 wäre die deklaration als "function" dagegen implitiz "public static function" ... bei solchen legacy konstrukten kann ich es ja noch halbwegs nachvollziehen, das etwas unsauber ist weil man an altlasten gebunden ist ...

aber das grundlegende konzept das php als oo konzept fährt ist so schwammig wie der rest der sprache ... man unterscheidet 2 arten von kontexten statisch und objekt bezogen ... das gibt es bei c++ und co auch? VORSICHT ... dem ist nicht so ... sprachen wie c++,java und co unterscheiden hier statische kontexte, und instanz bezogene kontexte, soll heißen instanzen einer klasse teilen sich den satz an nicht statischen methoden ihrer klasse, und diese methoden sind nur für diese instanzen deffiniert ... allenfalls noch für instanzen von klassen die von der deffinierenden klasse erben. das ist einer der wesentlichen punkte einer sauberen oo sprachdefinition ...

theoretisch müssten alle deine php funktionen vor der benutzung von $this die klassenzugehörigkeit prüfen ... ist das logisch? welchen sinnvollen nutzen hat diese aufweichung des etablierten oo konzepts?
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 27.06.10, 18:45   #11 (permalink)
 
Benutzerbild von rami
 
Registriert seit: 09.02.08
rami Leistung: Facit NTK
rami eine Nachricht über ICQ schicken rami eine Nachricht über Skype™ schicken
Likes: 0
Standard

Zitat:
Zitat von GrafZahl Beitrag anzeigen
Code:
object(Bar)#2 (0) {
}
DAS ist fail, das stimmt.

Zitat:
Zitat von GrafZahl Beitrag anzeigen
die "this" referenz zeigt auf den objektbezug ... ist dieser nicht gegeben, zeigt sie auf NULL (ist eigentlich nicht existent, aber in php hat ja so ziemlich alles einen wert ... es muss nichtmal existieren...)
Das wiederrum ist falsches Bashing. Es hat keinen Wert und existiert nicht. NULL ist die grafische Darstellung von var_dump von nicht existenten Variablen. null bedeutet, dass die Variable nicht existiert. Es ist an sich kein Wert.

PHP-Code:
<?php
$nichtexistent 
null;
var_dump(isset($nichtexistent));

$foo "bar";
unset(
$foo);
var_dump($foo);

/* Output:

bool(false)
NULL
*/
__________________
rami ist offline   Mit Zitat antworten
Alt 27.06.10, 22:05   #12 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 191
Standard

Zitat:
Zitat von rami Beitrag anzeigen
Das wiederrum ist falsches Bashing. Es hat keinen Wert und existiert nicht. NULL ist die grafische Darstellung von var_dump von nicht existenten Variablen. null bedeutet, dass die Variable nicht existiert. Es ist an sich kein Wert.
NULL ist keine "graphische" darstellung ... es ist der semantische begriff für "nichts" ... die tatsache dass etwas zu NULL evaluiert wird, das nicht deffiniert ist stört mich hier...

das php nicht typsicher ist, ist eine sache ... aber es ist eine andere, dass grundlegend alles was nicht deffiniert ist zu NULL evaluiert wird ...

du greifst auf etwas zu und erhälst die aussage, dass es keinen wert besitzt (=NULL) ... ganz egal ob das worauf du zugreifst überhaupt existiert oder nicht ... rein von der logik passt das nicht ... auf dinge die nicht existieren, sollte nicht zugegriffen werden können ... wenn sie existieren, haben sie entweder einen wert, oder ggf. eben nicht (=NULL) ...

so wie es ist, ist es eine macke im design der sprache, die das potential zur fehlerquelle hat

klar funktioniert es, und es ist auch nicht diese eine macke die aus php eine schwammige, unscharfe sprache macht, aber es kommt eines zum anderen ...
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 27.06.10, 23:17   #13 (permalink)
Member of Honour
Themenstarter
 
Benutzerbild von Brabax
 
Registriert seit: 04.10.01
Brabax Leistung: 8086Brabax Leistung: 8086
Brabax eine Nachricht über ICQ schicken
Likes: 34
Standard

Moin!

Zitat:
NULL ist keine "graphische" darstellung ... es ist der semantische begriff für "nichts" ... die tatsache dass etwas zu NULL evaluiert wird, das nicht deffiniert ist stört mich hier...
var_dump ist doch aber auch nur eine Funktion mit entsprechenden Rückgabewerten.
Ist es dann nicht sehr wahrscheinlich, dass man es sich hier mit den Rückgabewerten einfach gemacht und gesagt hat, dass eine nichtexistente Variable ganz einfach "NULL" als Rückgabewert enthält?

lG

Brabax
__________________

<< Wir leben bereits im morgigen Gestern, doch vom gestrigen Morgen sind wir noch weit entfernt. >>

<< Träume sind Schäume. Es liegt an dir ob du sie lebst oder ein Schaumschläger bist! >>

<< Erst wenn man beginnt zu implizieren, wird man merken, dass einem sowieso keiner richtig zuhört. >>
Brabax ist offline   Mit Zitat antworten
Alt 28.06.10, 02:13   #14 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 191
Standard

es geht nicht um var_dump ...

es geht um die sprache an sich ...
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 28.06.10, 11:53   #15 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 75
Standard

Zitat:
Zitat von GrafZahl Beitrag anzeigen
das php nicht typsicher ist, ist eine sache ... aber es ist eine andere, dass grundlegend alles was nicht deffiniert ist zu NULL evaluiert wird ...

du greifst auf etwas zu und erhälst die aussage, dass es keinen wert besitzt (=NULL) ... ganz egal ob das worauf du zugreifst überhaupt existiert oder nicht ... rein von der logik passt das nicht ...
Natürlich passt das von der Logik her:
Da in PHP keine Variablen-Deklaration nötig ist, ist es auch schwer, von "existiert nicht" zu reden... Die Variable existiert ab dem Moment, wo sie genutzt wird - und wenn sie keinen Wert hat, ist sie NULL.

Und wenn man (was man in seiner Entwicklungs-/Test-Umgebung immer machen sollte) error_reporting auf E_ALL stellt, dann haut PHP auch 'ne Warnung bzw. Notice raus, wenn man z.B. nicht deklarierte Variablen lesen will oder einem noch nicht deklariertem Array Werte anhängen möchte,... somit geht man sicher, dass man keine unnötigen Fehlerquellen einbaut.

Ich gebe dir Recht, dass PHP vom Design her vielleicht mehr (okay: vielleicht auch wesentlich mehr) potentielle Fehlerquellen bietet, als es manch andere Sprache tut. Aber was du hier veranstaltest, ist echt einfach nur Sprach-Bashing.

"OOP" in PHP4 war wirklich Murks, OOP in PHP5 hat sicherlich noch so seine kleinen Eigenheiten, aber auch viel Potential (also ich code gerne und viel OOP in PHP5) - schauen wir mal, wie sich das ganze in PHP6 weiterentwickelt...
beavisbee ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » PHP Statischen Aufruf erkennen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61