php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 26.06.2011, 12:15  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard Alternative für get_called_class

Hi,

leider ist es im Moment nicht möglich, PHP 5.3 zu nutzen und somit auch nicht get_called_class zu verwenden. Gibt es eine Alternative bzw. anderweitige Lösung / Workaround um das gleiche Ergebnis unter PHP 5.2 zu bekommen?
axelf ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 26.06.2011, 12:22  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

http://www.php.net/manual/en/functio...lass.php#93799
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 26.06.2011, 12:30  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard

vielen Dank.
axelf ist offline   Mit Zitat antworten
Alt 28.06.2011, 12:03  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von axelf Beitrag anzeigen
Hi,

leider ist es im Moment nicht möglich, PHP 5.3 zu nutzen und somit auch nicht get_called_class zu verwenden. Gibt es eine Alternative bzw. anderweitige Lösung / Workaround um das gleiche Ergebnis unter PHP 5.2 zu bekommen?
Bevor du jetzt in Erwägung ziehst, diesen grausamen Hack tatsächlich zu benutzen:

* $this weiß, von welcher Klasse es abgeleitet wurde. In einer gewöhnlichen Objekt-Methode reicht daher get_class($this).

* Singletons sind echte Objekte und wissen daher auch, zu welcher Klasse sie gehören.

* ("Statische") Klassenmethoden können (in PHP < 5.3.0) nur die Klasse "sehen", in der sie definiert wurden. Die einzige Möglichkeit hier an die "aufgerufene" Klasse zu kommen, ist, die gesamte Aufruf-Kette nachzubauen. Jede Methode, die über den get_called_class()-Ersatz erreichbar sein soll, muss in der Tochterklasse existieren und den Aufruf an die Elternklasse weiterreichen. Das sieht nicht besonders schön aus:

PHP-Code:
// Eltern-Klasse

class mom {
    static function 
do_something() {
        return 
get_called_class_52();
    }
}

// Kind-Klasse

class child extends mom {
    static function 
do_something() {
        
// using call_user_func() here would pollute the callback-chain
        
$func __function__;
        return 
parent::$func();
    }
}

// get_called_class()-Ersatz

function get_called_class_52() {
    
$trace debug_backtrace();
    
array_shift($trace);
    
$method $trace[0]['function'];
    
$class $trace[0]['class'];
    
// traverse the call-chain
    
foreach ($trace as $level => $invoked) {
        if (
            !isset (
$invoked['class']) || // not a (static) method
            
($inv_class $invoked['class']) !== $class && // not the same class
            
get_parent_class($inv_class) !== $class || // not the parent class
            
$invoked['function'] !== $method  // parent class, but other method
        
) {
            break;
        }
        
$class $inv_class;
    }
    return 
$class;
}

// Test:

printf("mom: %s\r\n"mom::do_something());
printf("child: %s\r\n"child::do_something());

// Spezialfaelle:

// statische Methoden lassen sich auch von Objekten aus aufrufen:
$obj = new child();
printf("child: %s\r\n"$obj->do_something());

// Funktion mit dem gleichen Namen wie die Methode:
printf("func: %s\r\n"do_something());

// andere Klasse, gleicher Methoden-Name
printf("other class: %s\r\n"ds::do_something('child'));

function 
do_something() {
    return 
child::do_something();
}

class 
ds {
    static function 
do_something($class) {
        return 
$class::do_something();
    }

Anyway: Der Umstieg auf PHP >= 5.3 ist anzuraten, wenn dieses "Feature" wirklich benötigt wird.

==
Das, was ich anfangs hier schrub, ist natürlich Unsinn und funktioniert in PHP so nicht, weil self und __CLASS__ immer auf die Klasse zeigen, in der sie deklariert wurden. Der Ordnung halber bleibt das aber stehen, sonst versteht keiner mehr den Rest der Diskussion:


* Für ("statische") Klassenmethoden kann man der Klasse bei der Deklaration eine Variable oder Konstante mitgeben, die den Namen der Klasse enthält.

Das ist zwar auch äußerst unschön (und unter Umständen schlecht zu warten, weil dieser Wert dann mit jeder Änderung des Klassennamens mitgeändert werden muss), aber allemal effizienter, als die Datei (auch noch mit file()) einzulesen, in der die Klasse deklariert wurde und dann deren Quelltext zu "parsen".

Geändert von fireweasel (28.06.2011 um 21:51 Uhr).
fireweasel ist offline   Mit Zitat antworten
Alt 28.06.2011, 12:31  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Das ist zwar auch äußerst unschön (und unter Umständen schlecht zu warten, weil dieser Wert dann mit jeder Änderung des Klassennamens mitgeändert werden muss)
PHP-Code:
class Foo
{
const 
__CLASS __CLASS__;
}
echo 
Foo::__CLASS// "Foo" 


Edit: Allerdings wüsste ich gerade gar nicht, was das ohne late static binding (wiederum seit PHP 5.3) bringen soll...
fab ist offline   Mit Zitat antworten
Alt 28.06.2011, 14:11  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von fab Beitrag anzeigen
PHP-Code:
class Foo
{
const 
__CLASS __CLASS__;
}
echo 
Foo::__CLASS// "Foo" 
Das bringt nichts. Ich meinte das eher so:

PHP-Code:
class mom {
    const 
class_name 'mom';

    static function 
whoAmI() {
        return 
self::class_name;
    }
}

class 
child inherits mom {
    const 
class_name 'child';
}

echo 
mom::whoAmI(); // 'mom'
echo child::whoAmI(); // 'child' 
Zitat:
Edit: Allerdings wüsste ich gerade gar nicht, was das ohne late static binding (wiederum seit PHP 5.3) bringen soll...
Nun, get_called_class() ist "late static binding"[0]. Es ging ums Emulieren dieses Verhaltens in PHP 5.2.x: Dort kommst du nur an den Namen der Klasse, in der die Funktion deklariert wurde, gewünscht ist aber die Klasse, deren (statische) Methode aufgerufen wurde.

--
[0] Was auch immer die PHP-Developer unter diesem Begriff verstehen.
fireweasel ist offline   Mit Zitat antworten
Alt 28.06.2011, 14:22  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Das bringt nichts. Ich meinte das eher so:

PHP-Code:
class mom {
    const 
class_name 'mom';

    static function 
whoAmI() {
        return 
self::class_name;
    }
}

class 
child extends mom {
    const 
class_name 'child';
}

echo 
mom::whoAmI(); // 'mom'
echo child::whoAmI(); // 'child' 
Was heißt "das bringt nichts"? Ersetze 'mom' mit __CLASS__ und das von dir angesprochene Problem bei ändernden Klassennamen entfällt. Was dagegen nichts bringt ist das vorschalten einer Methode, es sei denn du definierst sie in jeder Klasse neu. "self" referenziert hier immer die Klasse "mom". Führe deinen Code einmal aus, die Ausgabe ist "mommom".


Edit: Ohne get_called_class oder static::class_name sieht es also so aus:

PHP-Code:
class mom {
    const 
class_name __CLASS__;

    static function 
whoAmI() {
        return 
self::class_name;
    }
}

class 
child extends mom {
    const 
class_name __CLASS__;
    static function 
whoAmI() {
        return 
self::class_name;
    }
}

echo 
mom::whoAmI(); // 'mom'
echo child::whoAmI(); // 'child' 
einfacher wird es nicht...
fab ist offline   Mit Zitat antworten
Alt 28.06.2011, 15:39  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Aaaaaah, jetzt verstehe ich, was du meinst. Stimmt, sobald man mit self versucht, eine Klasse zu referenzieren, bekommt man immer die, in der das self niedergeschrieben wurde.
fireweasel ist offline   Mit Zitat antworten
Alt 28.06.2011, 20:55  
Benutzer
 
Registriert seit: 29.05.2011
Beiträge: 58
PHP-Kenntnisse:
Anfänger
axelf befindet sich auf einem aufstrebenden Ast
Standard

Hi,

mittlerweile kann ich auch 5.3 nutzen und alles ist in Butter
axelf ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Navicat openSource Alternative dreamcatcher Off-Topic Diskussionen 1 28.05.2011 11:14
SEARCH deutsche Alternative für PorterStemmer algorithmus? phpstudent Datenbanken 14 08.03.2010 22:34
Alternative zu file_get_contents() Hannibal PHP Tipps 2009 5 19.09.2009 14:20
Alternative zu LongTail Player... halskrause Off-Topic Diskussionen 2 16.07.2009 13:39
$_GET alternative fuer URL paramenter chris2009 PHP-Fortgeschrittene 5 23.11.2008 18:12
Alternative zu mail() heohni PHP Tipps 2006 15 23.02.2006 14:34
Alternative zur IP Sperre PHP Tipps 2007 4 02.12.2005 13:19
Alternative zu fopen hilfe zapate PHP Tipps 2005-2 5 30.10.2005 23:38
Alternative zu Include PHP Tipps 2005-2 11 13.10.2005 14:13
Alternative IF-Syntax Chr!s PHP Tipps 2005-2 5 16.09.2005 18:10
Tracker - Alternative falls der User JS deaktiviert hat? Chr!s PHP Tipps 2005-2 6 27.07.2005 19:51
Alternative zu simplexml Buhmann Beitragsarchiv 6 17.05.2005 16:10
[Erledigt] Alternative zu Frameset HTML, Usability und Barrierefreiheit 16 13.05.2005 20:18
Gibt es eine Alternative für phpkit ? PHP Tipps 2005 1 08.03.2005 16:52
Alternative Validator Icons El Barto HTML, Usability und Barrierefreiheit 6 14.01.2005 19:09

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
get_called_class, get_called_class php 5.2, php get_called_class, get_called_class alternative, get_called_class(), php 5.2 get_called_class, get_called_class php, get_called_class static, get_called_class funktion, get_called_class alternative php 5.2, php 5.2 get_called_class replacement, get_called_class in php 5.2, singleton get_called_class php, fireweasel singleton late static binding, get_called_class für php 5.2, get_called_class workaround, get_called_class 5.0, php get_called_class_52, php 5.2 working around static

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:58 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum