PHP self:: in andere Funktion übergeben

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
838
Hallo,

und zwar möchte ich den Inhalt einer andere Funktion übergeben. Jedoch werden alle Inhalte dabei gelöscht.

Hier mein Code:

PHP:
class Test {
    /**
     * @var array
     */
    protected static $tests= array();

    public function getTests() {
        return self::$tests;
    }

    /**
     * @param \TYPO3\CMS\Core\Resource\FileReference $reference
     *
     */
    public function addFileReference(\TYPO3\CMS\Core\Resource\FileReference $reference) {
        [...]
        self::$tests = ...;
    }
}

Es wird zuerst die getTests() angesteuert.
Während ich in der Funktion addFileReference ein volles Array zurück bekomme (so wie ich die Ergebnisse erwarte), wenn ich danach ein Debug durchführe, erhalte ich in der Funktion getTests() eine leeres Array.

Wo ist mein Fehler?
 
Ich hab jetzt schon länger nix mehr mit PHP gemacht, aber kannst du da nicht einfach Test::$tests verwenden?
 
@berto: Habe ich auch schon probiert. Gleiche Fehler.

@theEvil007: Inwiefern? Wenn ich das static herausnehme, erhalte ich folgenden Fehler:

PHP:
Access to undeclared static property:
 
Nimm das static weg, und greife mit $this-> auf die Eigenschaft zu. Willst Du dann darauf zugreifen nimm eine statische Methode, falls es denn ein static-Zugriff sein muss
 
Achso, klar. Sorry, ja.

Aber gleiche Ergebnis. Array ist leer.

php7.2 ist im Einsatz.
 
poste doch bitte einmal den aktualisierten Code und wie Du Deine Klasse implementierst
 
Zeile 17 ist das Array gefüllt. Bei Zeile 8 ist es empty.

PHP:
class Test {
    /**
     * @var array
     */
    protected $tests = array();

    public function getTests() {
        return $this->tests;
    }

    /**
     * @param \TYPO3\CMS\Core\Resource\FileReference $reference
     *
     */
    public function addFileReference(\TYPO3\CMS\Core\Resource\FileReference $reference) {
        [...]
       $this->tests = ...;
    }
}
 
Du erstellst also eine neue Instanz von Test, rufts Test->addFileReference auf, dann ist das array gefüllt, und direkt danach rufst Du Test->getTests auf und das array ist leer?
 
Nein, erstaufruf über Test->getTests(), die ich über eine andere Funktion ansteuere.
Zwischen Zeile 17 und 18 mache ich ein var_dump. Array gefüllt.
Und zwischen Zeile 7 und 8 ist das var_dump leer.
 
Ohne einen Aufruf von Test->addFileReference?
Deine Implementation der Klasse Test mal ansatzweise zu sehen wäre wirklich hilfreich
 
Kann ich gern mitposten.

Hier:

PHP:
class Test2 {
  /**
  * action list
  *
  * @return void
  */
  public function listAction() {
       $this->service = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TES\Test\Service\Service');
       $references = $this->service->getTests();
       $this->view->assign('references ', $references );
  }
}
 
Zuletzt bearbeitet:
Ich sehe nicht an welcher Stelle addFileReference() hier aufgerufen werden sollte. Klar, dass das array dann leer ist.
 
Schumiel schrieb:
Zwischen Zeile 17 und 18 mache ich ein var_dump. Array gefüllt.

Wie geschrieben, es ist nicht leer.
Ich kann auch $this->tests = array("1","2"); schreiben. Es bleibt zwischen Zeile 17/18 voll und in Zeile 7/8 plötzlich leer.

Da spielt es keine Rolle, wo addFileReference() aufgerufen wird.
 
Zeile 17/18 ist ja innerhalb addFileReference(), aber das rufst du in dem geposteten Code nie auf. Ich kann nur raten, dass du jedesmal, um die Klasse zu bekommen, GeneralUtility::makeInstance aufrufst. Ich kenne mich mit TYPO3 nicht aus, aber ich vermute dass hier immer eine neue Instanz erstellt wird, also ist das Array immer leer.
 
für mich erschliesst sich leider auch nicht, wie es sein kann, dass Du ein gefülltes Array hast, ohne die Methode aufzurufen.
 
Schumiel schrieb:
Wie geschrieben, es ist nicht leer.
Ich kann auch $this->tests = array("1","2"); schreiben. Es bleibt zwischen Zeile 17/18 voll und in Zeile 7/8 plötzlich leer.

Da spielt es keine Rolle, wo addFileReference() aufgerufen wird.

Natürlich spielt das eine Rolle. Wenn Du innerhalb der Funktion "addFileReference" anzeigen lässt, ob das Array nicht leer ist, sagt das nichts darüber aus, ob "addFileReference" vor "getTests" aufgerufen wird.

Wenn Dir der Ablauf rein vom Code her nicht klar ist, nutzt den Debugger. "addFileReference" muss vor "getTests" aufgerufen werden, ansonsten ist das Array natürlich leer, wenn das die einzige Funktion ist, die das Array manipuliert.
 
Zurück
Oben