php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 06-11-2008, 20:54
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard Klassennamen aus einer abgeleiteten statischen Klasse abfragen=?

Ich werde aus den Kommentaren zu get_class() auf php.net nicht klar. Das Problem wird bestätigt, aber keine Lösung gezeigt.

Ich habe eine allgemeine Plugin-Klasse.
Von dieser werden Plugin-Klassen abgeleitet.

Diese Plugin-Klassen werden statisch aufgerufen, um sich in ein allgemeines Register zu hängen. Also so:

PHP-Code:
// die allgemeine Klasse

class allgemeinePluginKlasse
 
{
   var 
$pfad null;
   var 
$name null;
   
   function 
init() 
   ...

 } 

// ein abgeleitetes Plugin

class meinPlugin extends allgemeinePluginKlasse
 
{
  
   
// Diese Methode soll statisch aufgerufen werden:

   
function init()
    {
      echo 
"Hallo. Ich bin das Plugin namens ".__CLASS__."!";
   
    }

 }

// statischer Aufruf
meinPlugin::init();

// Ergebnis unter PHP 4

HalloIch bin das Plugin namens allgemeinePluginKlasse
die Konstante __CLASS__ gibt mir immer nur die Urklasse zurück.
Auf get_class() kann ich nicht zurückgreifen, weil ich mich hier ja nicht im Objektkontext befinde.

Weiß jemand, wie man an den Klassennamen der abgeleiteten Klasse rankommt?
Muß wie gesagt noch PHP4-Kompatibel sein.

Geändert von pekka (06-11-2008 um 20:57 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 06-11-2008, 21:57
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Also, mit PHP 4 bekomme ich bei __CLASS__ die abgeleitet Klasse.

PHP-Code:
<?php
    
    
class firstClass {
        function 
getClass() {
            return 
__CLASS__;
        }
    }
    
    class 
secondClass extends firstClass {
        function 
getClass() {
            return 
__CLASS__;
        }
    }
    
    echo 
phpversion(); // 4.4.7
    
echo '<br />';
    echo 
firstClass::getClass(); // firstClass
    
echo '<br />';
    echo 
secondClass::getClass(); // secondClass


?>

Geändert von unset (06-11-2008 um 22:00 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 06-11-2008, 23:03
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Du suchst wohl: get_called_class()

Aber das gibts erst mit PHP5.3: http://de.php.net/manual/en/function...lass.php#86230

PHP-Code:
<?php
error_reporting
(E_ALL);
ini_set('display_errors'TRUE); 


abstract class 
Singleton
{
    private static 
$instances= array();
    
    final public static function 
getInstance()
    {
      
$class get_called_class();
      if(empty(
self::$instances[$class]))
        
self::$instances[$class] = new $class;
      return 
self::$instances[$class];
    }

    protected function 
__construct(){}
    final private function 
__clone(){}
}


class 
mytest extends Singleton
{

}

$my MyTest::getInstance();

echo 
get_class($my);
?>
Also:
Mit PHP4 keine Chance!
__________________
Wir werden alle sterben

Geändert von combie (06-11-2008 um 23:11 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 06-11-2008, 23:30
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von combie
Du suchst wohl: get_called_class()

Also:
Mit PHP4 keine Chance!
Das stimmt imho nicht. Es gibt für get_called_class() ein (zugegeben) recht unschönes Workaround über debug_backtrace. Ich glaube das mal im Zusammenhang mit dem ActiveRecord-Pattern gelesen zu haben. Google spuckt bestimmt was aus

Grüße
Mit Zitat antworten
  #5 (permalink)  
Alt 06-11-2008, 23:49
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Naja, evtl. bin ich da ja etwas zu dogmatisch, aber ich finde:
Sowohl Debug Backtrace als auch Reflection sollten nicht im Regelbetrieb eingesetzt werden.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #6 (permalink)  
Alt 06-11-2008, 23:55
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von combie
Naja, evtl. bin ich da ja etwas zu dogmatisch, aber ich finde:
Sowohl Debug Backtrace als auch Reflection sollten nicht im Regelbetrieb eingesetzt werden.
Ich denke das ist tatsächlich eine Glaubensfrage. Ich habe auch bewusst angemerkt, dass der Umweg recht unschön ist.
Bei Reflection sehe ich persönlich das gar nicht so eng, zumal sie in einiger Hinsicht im produktiven Betrieb sehr nützlich sein kann.
Mir gings nur darum zu erwähnen, dass es doch eine und nicht keine Chance gibt

Hier ist übrigens das Ungetüm aus dem PHP-Manual (User Comments zu Late Static Binding):
Zitat:
PHP-Code:
/**
 * Return called class name
 *
 * @author Michael Grenier
 * @param int $i_level optional
 * @return string
 */
function get_called_class ($i_level 1)
{
    
$a_debug debug_backtrace();
    
$a_called = array();
    
$a_called_function $a_debug[$i_level]['function'];
    for (
$i 1$n sizeof($a_debug); $i $n$i++)
    {
        if (
in_array($a_debug[$i]['function'], array('eval')) ||
            
strpos($a_debug[$i]['function'], 'eval()') !== false)
            continue;
        if (
in_array($a_debug[$i]['function'], array('__call''__callStatic')))
            
$a_called_function $a_debug[$i]['args'][0];
        if (
$a_debug[$i]['function'] == $a_called_function)
            
$a_called $a_debug[$i];
    }
    if (isset(
$a_called['object']) && isset($a_called['class']))
        return (string)
$a_called['class'];
    
$i_line = (int)$a_called['line'] - 1;
    
$a_lines explode("\n"file_get_contents($a_called['file']));
    
preg_match("#([a-zA-Z0-9_]+){$a_called['type']}
                {$a_called['function']}( )*\(#"
$a_lines[$i_line], $a_match);
    unset(
$a_debug$a_called$a_called_function$i_line$a_lines);
    if (
sizeof($a_match) > 0)
        
$s_class = (string)trim($a_match[1]);
    else
        
$s_class = (string)$a_called['class'];
    if (
$s_class == 'self')
        return 
get_called_class($i_level 2);
    return 
$s_class;


Geändert von Griecherus (07-11-2008 um 00:21 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 07-11-2008, 00:43
pekka
 PHP Master
Links : Onlinestatus : pekka ist offline
Registriert seit: Jun 2001
Ort: Köln
Beiträge: 6.608
pekka befindet sich auf einem aufstrebenden Ast
Standard

Hey, vielen Dank für die rege Diskussion!

@unset: Was ich falsch dargestellt habe: Der __CLASS__ -Aufruf findet in der Basisklasse statt. Sorry.

Uaaah, das Ungetüm ist für eine schlanke, schnelle Plugin-Verwaltung natürlich ein bisschen arg Dann gleich noch eine ganz blöde PHP4-OOP-Frage: Gibt es im statischen Kontext einen Weg, an die (in der Klassendefinition gesetzten) Variablen einer Klasse ranzukommen?
Also

PHP-Code:

// die allgemeine Klasse

class allgemeinePluginKlasse
 
{
  
   var 
$classname "allgemeinePluginKlasse";
   
   function 
showClassname() 
    {
   
// So gehts statisch natürlich nicht
   
echo $this->classname;
  
  }

 } 

// ein abgeleitetes Plugin

class meinPlugin extends allgemeinePluginKlasse
 
{
  
  var 
$classname "meinPlugin";  

 }

// Gewünschte Ausgabe: "meinPlugin"

meinPlugin::showClassname();   // Fehler: Cannot use $this when not in object context 
Mit Zitat antworten
  #8 (permalink)  
Alt 07-11-2008, 00:46
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.593
h3ll befindet sich auf einem aufstrebenden Ast
Standard

PHP 4 ist eh schon offiziell eingestellt. Wozu noch dafür programmieren? Nur weil es noch irgendwelche Steinzeit-Server gibt, die die halbe Informatikgeschichte verschlafen haben?
Mit Zitat antworten
  #9 (permalink)  
Alt 07-11-2008, 00:59
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Da PHP4 keine statichen Eigenschaften kennt, wird das auch nicht viel..

Aus meiner Wühlkiste, evtl. kannst da was mit angangen:
PHP-Code:
<?php

// PHP4 Singleton Factory
function & singleton($class)
{
  static 
$instances = array();
  
$class strtolower($class);
  if(!isset(
$instances[$class]))
      
$instances[$class] = & new $class;
  return 
$instances[$class];
}


class 
test
{
    
// Diese Methode muß in jede betreffnende Klasse kopiert werden
    
function & getInstance() 
    {
      return  
singleton(__CLASS__);
    }
}


$mytest = & test::getInstance();
?>
__________________
Wir werden alle sterben

Geändert von combie (07-11-2008 um 01:02 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 07-11-2008, 01:06
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

OffTopic:
Du hast Singleton sehr gerne, oder?
Mit Zitat antworten
  #11 (permalink)  
Alt 07-11-2008, 01:37
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Nicht wirklich ..
Nur wegen der Ähnlichkeit des Problems habe ich sie hier erwähnt. Es ist eine der wenigen Situationen, wo uns die Vererbung in PHP einen derben Streich spielt.
__________________
Wir werden alle sterben
Mit Zitat antworten
  #12 (permalink)  
Alt 07-11-2008, 09:46
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Das Problem hatte ich vor geraumer Zeit selbst (ActiveRecord ^^, wohl auch ähnliches Problem). Das bin ich dann so umgangen, dass die Methode, bei dir zum Beispiel init(), eine protected (in PHP4 darfst du sie dann halt nicht aufrufen) Methode aufruft und den zu verwendenden Klassennamen übergibt, analog zu combie's letztem Beispiel. Und das funktioniert auch ziemlich gut, da du über call_user_func auch wieder auf überschriebene Methoden der Unterklasse zu greifen kannst.

PHP-Code:
class ActiveRecord {
    public static function 
find() {
        
$args=func_get_args();
        return(
self::_find(__CLASS__$args));
    }
    protected static function 
_find($class$args) {
        
// ...
    
}
}

class 
MyAR extends ActiveRecord {
    public static function 
find() {
        
$args=func_get_args();
        return(
self::_find(__CLASS__$args));
    }

Etwas unschön ist nur, dass du die Aufrufe entsprechend in jedem AR hast. War hier aber kein Problem, da die Unterklassen eh generiert werden.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:10 Uhr.