• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Late Static Binding, Static Init

CGollhardt

Mitglied
Hallo Miteinander,

ich sitze vor einem ziemlich großen Problem gerade. Und zwar möchte ich im Child einer Klasse Statische Fields des Parents bearbeiten.

PHP:
<?php
interface StaticInitializier {
  public static function StaticInit();
}


abstract class ParentClass implements StaticInitializier {
  protected static $_foo;

  public static function Test() {
  echo '<p>' . static::$_foo . '</p>';
  }
}


class FirstClass extends ParentClass {
  public static function StaticInit()
  {
  self::$_foo = '42';
  }
}
FirstClass::StaticInit();


class SecondClass extends ParentClass {
  public static function StaticInit()
  {
  self::$_foo = '43';
  }
}
SecondClass::StaticInit();


class ThirdClass extends ParentClass {
  public static function StaticInit()
  {
  self::$_foo = '44';
  }
}
ThirdClass::StaticInit();

FirstClass::Test();
SecondClass::Test();
ThirdClass::Test();
?>

Erwartet: 42, 43, 44
Erhalten: 44, 44, 44

Irgendwie beziehen sich die static Fields auf die Parent Klasse?

Was ich halt erreichen will, ist nicht über ein Interface zu gehen, damit die Field private bleiben können. Und abstrakte statische Methoden enden mit einem Strict Error.

Weis jemand von euch Rat?
 
Werbung:
Da eine Abstrakte Klasse immer noch eine Klasse ist sieht es für mich nur logisch aus, dass am ende immer 44 rauskommt.

PHP:
<?php

interface StaticInitializier {

    public static function StaticInit();
}

abstract class ParentClass implements StaticInitializier {

    public static function Test() {
        echo '<p>' . static::$_foo . '</p>';
    }

}

class FirstClass extends ParentClass {

    protected static $_foo;
  
    public static function StaticInit() {
        self::$_foo = '42';
    }

}

FirstClass::StaticInit();

class SecondClass extends ParentClass {
  
    protected static $_foo;
  
    public static function StaticInit() {
        self::$_foo = '43';
    }

}

SecondClass::StaticInit();

class ThirdClass extends ParentClass {

    protected static $_foo;
  
    public static function StaticInit() {
        self::$_foo = '44';
    }

}

ThirdClass::StaticInit();

FirstClass::Test();
SecondClass::Test();
ThirdClass::Test();

So funktioniert es deinen Erwartungen entsprechen. Du hast in deinem Beispiel halt nur einen Reservierten Platz zum Speichern des Ints.

Vielleicht kann man dir besser helfen, wenn du mehr Informationen zum Verwendungszweck zur verfügung stellst.[/php]
 
Zurück
Oben