php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.01.2012, 23:58  
php.de
Gast
 
Beiträge: n/a
Standard self vs. __CLASS__

Ich würde nur mal gern sicherheitshalber etwas nachfragen.
PHP-Code:
<?php
   error_reporting
(-1);
   class 
{
      static function 
getSelf() {
         return new 
self(0);
      }
      static function 
getClass() {
         
$c __CLASS__;
         return new 
$c(0);
      }
   }
?>
Gibt es letztendlich irgendeinen Unterschied zwischen der self- und der __CLASS__-Variante? Oder sind dann die ausgelieferten Objekte exakt gleich (mal davon abgesehen, dass es natürlich 2 unterschiedliche Instanzen sind)?
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.01.2012, 00:04  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Probiers aus?!
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 11.01.2012, 00:06  
php.de
Gast
 
Beiträge: n/a
Standard

Habe ich schon. Aber nur, weil ich irgendetwas ausprobiert habe, heißt das noch lange nicht, dass ich richtig getestet habe.
  Mit Zitat antworten
Alt 11.01.2012, 01:23  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von php.de Beitrag anzeigen
Gibt es letztendlich irgendeinen Unterschied zwischen der self- und der __CLASS__-Variante?
Grundsätzlich:
self ist die static referenz auf den Namensraum der Klasse. Wenn die Klasse instatiiert wurde, könnte stattdessen auch $this verwendet werden.
__class__ ist eine magische Konstante.

Solche Konsruktionen:
PHP-Code:
   class {
      static function 
getSelf() {
         return new 
self(0);
      }
      static function 
getClass() {
         
$c __CLASS__;
         return new 
$c(0);
      }
   } 
sind für mich gewöhnungsbedürftig.
In beiden Fällen werden Instanzen auf die Klasse zurückgegeben.

http://mod.php.developer.vc/test/24/

(0) ist unnötig (KA, wozu es gut sein soll) und kann weggelassen werden.
  Mit Zitat antworten
Alt 11.01.2012, 01:41  
php.de
Gast
 
Beiträge: n/a
Standard

Dieses (0) hatte ich vergessen rauszulöschen. Hatte bei der Klasse auch mit Parametern und weiteren Methoden herumexperimentiert.

Das kann man z. B. für Singleton-Klassen verwenden.

Sofern die beiden Varianten gleich sind, gibt es vielleicht irgendeinen Grund, warum man die eine oder die andere Variante bevorzugen sollte?

Geändert von php.de (11.01.2012 um 01:45 Uhr).
  Mit Zitat antworten
Alt 11.01.2012, 01:42  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

self und $this sind als Zeiger zu verstehen die auf die aktuelle Instanz / Klasse zeigen, __CLASS__ ist eine Konstante aus der Kombination des Namespace der Klasse und dem Klassennamen der Klasse, der die Funktion in der Sie genutzt wird repräsentiert, also ein String.

das new-Schlüsselwort Interpretiert self und $this sowie jede andere Variable insofern sie eine Objekt-Instanz hält als Objekt-Instanz und jede Variable oder Konstante die einen String enthält als einen Klassennamen. Konstanten generell können nicht direkt mit dem new-Schlüsselwort genutzt werden da sie im Interpreter mit tatsächlichen Klassennamen kollidieren, sie müssen daher stehts einer Variable zugewiesen werden.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 11.01.2012, 03:27  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von php.de Beitrag anzeigen
Sofern die beiden Varianten gleich sind, gibt es vielleicht irgendeinen Grund, warum man die eine oder die andere Variante bevorzugen sollte?
Wenn, dann die "self-Variante". Grund: eine Scriptzeile weniger.
  Mit Zitat antworten
Alt 11.01.2012, 06:57  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Ich weiß aber auch nochmal darauf hin das self als auch __CLASS__ immer auf die Klasse zeigen in der ihre nutzende Methode ethabliert wurde.

Szenario: Du definierst test() in class A und extendest A in Class B, so wird b bei aufruf von B::test() "A" zurückliefern. Ganz gleich ob statisch aufgerufen oder instanziiert. Einfach durch die gegen self'en ist nicht immer ein guter Weg, man sollte sich spätestens bei Klassen-Vererbung nicht auf self ( in jedwegen Kontext ) beziehen, sondern grundsätzlich get_called_class() nutzen, alles andere operiert in dem jeweiligen Definitionskontext - static::, classname::, $instance:: und self:: bewirken den gleichen Effekt.

PHP-Code:
class {
    static function 
test() {
    
        
var_dump( array(
            
'class' => __CLASS__,
            
'self' => get_class(new self),
            
'owner' => get_class(),
            
'parent' => get_parent_class(),
            
'called' => get_called_class()
        ) );
    }

PHP-Code:
class extends {
    static function 
mytest() {
        
var_dump( array(
            
'class' => __CLASS__
            
'self' => get_class(new self),
            
'owner' => get_class(),
            
'parent' => get_parent_class(),
            
'called' => get_called_class()
        ) );
    }

Test:
PHP-Code:
$test = new b;
$test->test(); 
Code:
array(5) {
  ["class"]=>
  string(1) "a"
  ["self"]=>
  string(1) "a"
  ["owner"]=>
  string(1) "a"
  ["parent"]=>
  bool(false)
  ["called"]=>
  string(1) "b"
}
PHP-Code:
$test->mytest(); 
Code:
array(5) {
  ["class"]=>
  string(1) "b"
  ["self"]=>
  string(1) "b"
  ["owner"]=>
  string(1) "b"
  ["parent"]=>
  string(1) "a"
  ["called"]=>
  string(1) "b"
}
static-test:
PHP-Code:
class extends {
    static function 
get() {
        static::
test();
    }

PHP-Code:
d::get(); 
Code:
array(5) {
  ["class"]=>
  string(1) "a"
  ["self"]=>
  string(1) "a"
  ["owner"]=>
  string(1) "a"
  ["parent"]=>
  bool(false)
  ["called"]=>
  string(1) "d"
}
Einzig static als Scope bietet die möglichkeit, die aktuelle Kindklasse in der man sich beim Aufruf der Funktion befindet, auch zu instanziieren und bietet zum zweizeiler ( Variablen-Zuweisung und erzeugung der Klasse per Variablen-String ( ähnlich __CLASS__ ) ) eine alternative:

PHP-Code:
class {
    static function 
unitest() {
        
var_dump( array(
            
'static' => get_class(new static)
        ) );
    }
}

class 
extends {
    

static scope test:
PHP-Code:
x::unitest(); 
Code:
x::test()
array(1) {
  ["static"]=>
  string(1) "x"
}
Und damit: Herzlich Willkommen im Thema 'Late Static Binding', der Übergreifende Themenbereich der automatisch und unumgänglich zum Thema "Die Welt von self, $this und __CLASS__" gehört.

Solltest du dich also dazu entscheiden, das wenn du dort Instanzen von etwas zurückgeben willst, das es egal ist ob deine Klasse extended wurde oder nicht, dann gehe auch entsprechend vor, in deinem Fall:

PHP-Code:
<?php 
error_reporting
(-1); 

class 

   static function 
getInstance() { 
      return new static; 
   } 
   static function 
getClassname() { 
      return 
get_called_class(); 
   } 
}
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (11.01.2012 um 07:14 Uhr). Grund: Bezug auf Startpost genommen.
tr0y ist offline   Mit Zitat antworten
Alt 11.01.2012, 13:05  
meikel
Gast
 
Beiträge: n/a
Standard

Danke für Deine ausführliche Informationen.
Zitat:
Zitat von tr0y Beitrag anzeigen
Szenario: Du definierst test() in class A und extendest A in Class B, so wird b bei aufruf von B::test() "A" zurückliefern. Ganz gleich ob statisch aufgerufen oder instanziiert. Einfach durch die gegen self'en ist nicht immer ein guter Weg, man sollte sich spätestens bei Klassen-Vererbung nicht auf self ( in jedwegen Kontext ) beziehen, sondern grundsätzlich get_called_class() nutzen, alles andere operiert in dem jeweiligen Definitionskontext - static::, classname::, $instance:: und self:: bewirken den gleichen Effekt.
Ich bin da langweilig und verwende (fast) ausschließlich den (für mich) "normalen Weg":
Code:
Klasse
  konstruktor
  (destruktor)
  (get)
  (set)
und

Code:
Klasse extends Elternklasse
viel script

Code:
instanz = new klasse(parameter)
Thema singleton + autoload
Hier ein kleines Beispiel (zum Verriß <ggg>)
PHP-Code:
<?php

/**
 *
 * @packet newLib
 * @author meikel at developer dot vc
 * @version $Id  31.10.2011 00:01:53 $
 * @info $Id: instance.class.php 31.10.2011 00:01:53 meikel $
 * @copyright 2011 meikel
 */

/**
 *
 *
 */
class instance{

    protected static 
$i = array();

    public function 
__construct(){
        
spl_autoload_extensions(CLASS_SUFFIX);
        
spl_autoload_register(array($this'classLoad'));
    }

    public function 
classLoad($name){
        include_once 
$name CLASS_SUFFIX;
    }

    public function 
__get($name){
        if(! isset(
self::$i[$name]))
            
self::$i[$name] = new $name;
        return 
self::$i[$name];
    }
}

?>
Voraussetzung: alle Scripte müssen über den include_path gefunden werden können.

Anwendungsbeispiel:
PHP-Code:
$new = new instance;
...
$instanz $new->klassenname;
...
$gleiche_instanz $new->klassenname 
  Mit Zitat antworten
Alt 11.01.2012, 13:11  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Das war noch nicht ausführlich ^^

Zu deinem Source.. äh, wie jetzt ? Kontext-Sprung ? o_O
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y 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
[Erledigt] self:: vs. $this-&gt; Cube PHP Tipps 2009 2 01.10.2009 20:16
Unterschied zwischen self, parent, this dennito PHP Tipps 2008 7 21.12.2008 12:24
Php self PHP Tipps 2005 4 26.03.2005 14:04

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
self vs. __class__, \__class__\ \$this\ unterschied php

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:45 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