Variable aus übergeordneter class ändern

Hallo

[kurz und knapp] möchte ich eine variable einer übergeordneten klasse ändern (genau genommen möchte ich ein array-element anhängen)

Die klassen sehen grob genommen etwa so aus:

class klasse { protected $scripts = array(); //... usw } //und class unterklasse extends klasse { function __construct { $this->scripts[] = "wert"; } }

wenn ich $this mittels print_r ausgeben lasse bekomme ich folgendes:

[code]unterklasse Object
(
[scripts:protected] => Array
(
)

[scrips] => Array
    (
        [0] => wert
    )

)
[/code]

Ich weiss echt nicht was ich falsch mache; mit public als Schlüsselwort vor $scripts hab ichs auch schon versucht…

Freundliche Grüsse
cedl

Der Fehler wird in deinem Source im Beitrag nicht angezeigt.
Bei der print_r Ausgabe sieht man aber dass das eine “scrips” das andere “scripts” geschrieben ist.
Überprüfe bitte nochmal ob du die Variablennamen korrekt geschrieben hast.

huch…
ja, das wars :ps:
danke :wink:

/Edit: ah nee :neutral_face:
wenn ich in ner funktion der übergeordneten klasse print_r aufrufe is da nix drin (also scripts ist leer) :susp:

Dann liefere doch bitte mal (ausführbaren) Beispielcode, mit dem sich das auch nachvollziehen lässt.

Aber sicher doch (sorry, dass ich das nicht gleich gemacht habe)

Ich habs n bissel zusammengeschnitten, dass es ohne die MySQL DB funktioniert und die unwichtigen Dinge (die das ganze nur unübersichtlicher machen) weggelassen.

Hier die index.php

Hier die system/modules/addon_test.php

Es gibt ein paar Grundregeln von OOP. Eine davon besagt, dass Klassenvariablen immer privat sind.
Das hat mehrere Gründe, wenn auch nicht direkt dich betreffend, aber es sollte dein Problem lösen.

class ccms {
  private $scripts = array();
  protected function add_script($script) {
    $this->scripts[] = $script;
  }
}

class addon_test extends ccms {
  public function __construct() {
    $this->add_script("nonsense.js");
  }
}

Außerdem wiedersprichst du hier den Grundlagen der Vererbung, weil ein Addon meiner Meinung nach kein cms ist (kann natürlich sein, dass ccms eine Basisklasse für Addons ist, aber das glaub ich nicht :stuck_out_tongue:)

Ein viel besseres Layout wäre dieses hier:

class ccms {
  private $addons = array();
  
  private $dbcon;
  
  private function load_addons() {
    //...
    foreach($addon_file) {
      $addon_class = require($addon_file);
      $this->addons[] = new $addon_class($this);
    }
    //...
  }
  
  public function get_dbcon() {
    return $this->dbcon;
  }
};

class AddonBase {
  
  private $ccms;
 
  public function __construct($parent_ccms) {
    $ccms = $parent_ccms;
  }
}


class AddonTest extends AddonBase {
  public function __construct($parent_ccms) {
    parent::__construct($parent_ccms);
  }
}

Sollte sich von selbst klären, wenn du etwas darüber nachdenkst…
Gibt natürlich noch bessere Layouts (zB wo die ccms-Klasse die DB-Verbindung nicht öffentlich zugänglich machen muss) aber so schaut das doch schon viel besser aus :wink:

Das ist falsch.

!coffee Das steht zwar so nirgends geschrieben, ist aber die übliche Vorgehensweise.

Natürlich gibt es auch Ausnahmen (zB das setzen von temporären Flags), aber auch das sollte von Methoden übernommen werden, damit sparst du dir einige Unannehmlichkeiten später.

protected zu nutzen, ist ebenso „üblich“ - es kommt halt auf den beabsichtigten Effekt an.

Ich hab noch nie eine protected Variable gebraucht :astonished:

Das liegt daran, dass die Basisklasse keine Ahnung hat was die abgeleitete Klasse daran ändert. Außerdem sind Änderungen durch Basisklassen sowiso sehr selten erwünscht, da abgeleitete Klassen ja nur Funktionalität hinzufügen sollen, aber niemals Funktionalität ersetzen.

Erfahrung mit OOP sieht anders aus.

In der Aussage kann ich in Bezug auf die Thematik keinen Sinn erkennen.

Natürlich sollen sie auch das gegebenenfalls.

Ok, danke für eure denkanstösse.
Ich denke das mit der addon_base ist das richtige (daran hab ich nämlich garnicht gedacht ^^)

Naja, das mit der DB-Verbindung…
Wenn ich das kontrollieren möchte, müsste ich ja eine funktion in der addon_base schreiben, die die Querys übernimmt und auch überprüft. Aber wird das nicht etwas aufwändig, wenn das Addon auch von sich aus die Einstellungen laden könnte, um dann die eigene, nicht kontrollierte Verbindung aufzubauen? :unamused:
Bzw. wie könnte ich verhindern, dass ein fremdes Addon (oder ein anderer fremder Teil) die Konfiguration laden kann…?

Grüsse
cedl

Indem du nicht das Addon die Konfiguration laden lässt, sondern dem Addon die Konfiguration “zuschiebst”. Zum Beispiel im Konstruktor :wink:

du meinst flock, oder?
Aber da passt ja i-wie gar keine operation, oder?
:unamused: bzw. LOCK_EX wär möglich, aber dann kann man die konfiguration ja sozusagen „löschen“ …

:unamused: bzw. ich könnte die datei temporär leeren (also inhalt in ner privaten variable speichern) und nacher wieder reinschreiben :ps: fatal-error=> konfiguration weg)

Nein, du lädst die Konfiguration im addon-loader und übergibst die Konfiguration als Array an den Addon-Konstruktor.

achso, ja :smiley:
bedeutet also, dass das addon dann gar keine verbindung zur DB benötigt…
aber was, wenn es ein addon gibt (oder geben soll xD) welches daten in der DB speichern muss, beispielsweise ein Counter.

Und das übliche problem, dass das addon via filesystem trotzdem auf die konfigurationsdatei zugreiffen kann ist dann ja noch nicht behoben :unamused:

PHP ist für sowas einfach nicht geeignet…

Na schön, dann lass ich mir was einfallen ^^