Verständnis Problem

dg87

Erfahrenes Mitglied
Moin,

ich programmiere derzeit ein paar Tutorials durch über das ZF.
Eine Grundlegende Frage will mir gerade im Moment wieder nicht klar sein.

Wenn ich eine Instanz von einem Objekt in Datei A) erstelle zB
PHP:
Klasse::set('info',$var);

und in Datei B) will ich darauf zugreifen:
PHP:
$test = Klasse::get('info');

Dann muss ich das doch irgendwie Global machen oder?
Oder ist die Instanz somit im Speicher und von überall verfügbar?

Die Hauptfrage ist für mich, wie registrier ich was in Objekten, sodass es für die komplette API verfügbar ist. Ich bin grad voll aufn Dampfer.
Mach gerade TuT von Zend Framework, und da wird zB eine INI mit Zend_Registry initialisiert und ist dann überall nutzbar.....
 
Zuletzt bearbeitet:
Kommt drauf an, wie Dein Konstrukt aussieht. Entweder übergibst Du einer anderen Klasse das Objekt (z.B. im Konstruktor) oder aber Du serialisierst das Objekt und packst es in eine Session.

Meine Fähigkeiten Deine Struktur zu erahnen sind aber arg beschränkt ob der fehlenden Beschreibung Deinerseits.
 
Wenn Klasse die Zend_Registry ist wäre das korrekt:

User.php
PHP:
/**
 * User - Model
 ******************/
class User
{
  /**
   * @var int
   * @private
   */
  private $_id;
  // Weitere Member-Variablen
  
  /**
   * Constructor
   * @param $id [int] Die Benutzer-ID
   */
  public function __construct($id)
  {
     $this->_id = (int)$id;
     // Hier zum Beispiel weitere Member-Variablen mit Werten versehen, z.B. aus einer DB
  }

  /**
   * Gibt die ID des Benutzers zurück
   * @return int
   */
  public function getId()
  {
    return $this->_id;
  }

  // Hier weitere Getter und Setter
}


test.php
PHP:
require 'Zend/Registry.php'; // oder über Autoload

// Neues Benutzer-Objekt erstellen
$user = new User(1);

// Benutzer in der Registry global verfügbar machen
Zend_Registry::set('user', $user);

profile.phtml (View-Script)
PHP:
<?php
// Benutzer aus der Registry holen
$user = Zend_Registry::get('user');
?>
<div class="profile">
<div id="userid"><?php echo $user->getId(); ?></div>
... hier noch weitere Profil-Infos des Benutzers
</div>

Meinst du das in etwa so?
 
Ja genau so.
Bei Zend gibt es ja viele Klassen, wo man einfach nur einmal was registiert und dann ist es global für die ganze Anwendung verfügbar.
Ich hab mich ein bisschen durch den Code gewühlt, aber nicht gefunden wo Zend letztendlich eine Instanz Global verfügbar macht.

Wie mach ich das auch, dass eine Instanz global über alle Variablen verügbar ist? Der Autoloader von Zend ist ja auch global, einmal in der bootstrap Datei initialisiert, wird von jeder anderer Datei aus die Klasse nachgeladen, obwohl der Autoloader in einer anderen Datei ist. Das Versteh ich irgenwie nicht.

Sorry.

Edit:

Aber genauso wie du es oben machst. In der View ist ja dann das Objekt auch verfügbar, aber wie macht man das, dass man von einer anderen Datei aus Zugriff hat auf diese Instanz?
 
Zuletzt bearbeitet:
Hast du doch über die Registry. Was ich da im View-Script gemacht hab, geht auch in jeder andern Datei. Was meinst du genau?
 
Ja das ist klar das macht die Registry. Aber ich will ja eben wissen wie man zb ohne Zend. Wie registrier ich ein objekt für die ganze applikation?
 
Im Grunde arbeitet die Registry mit einem internen Array. Die statische "set" legt ein Element mit dem Namen im Array an und setzt den Wert. Die "get" Methode schaut, ob es im Array ein Element mit dem Namen gibt und gibt dann den Wert des Elements zurück.
 
Ah ok und dieses Array ist als global deklariert worden? Also in php mit dem Schlüsselwort global?
 
Nein, das ist private und static. Hier mal ein einfaches Beispiel:

MyRegistry.php
PHP:
class MyRegistry
{
  /**
   * The elements in the registry
   * @var array
   * @private
   * @static
   */
  private static $_elements;

  /**
   * Add new item to registry
   * @param string $index The name of the element in registry
   * @param mixed $value The value of the element in registry
   * @return void
   */
  public static function set($index, $value)
  {
    // Füge das Element ohne weitere Prüfung ein
    self::$_elements[$index] = $value;
  }

  /**
   * Retrieve an element from registry
   * @param string $index The name of the element to retrieve from registry
   * @return mixed
   * @throws Exception
   */
  public static function get($index)
  {
    // Schau nach, ob das Element existiert
    if(!isset(self::$_elements))
      throw new Exception("No such element $index in Registry");
    // Gebe das Element zurück
    return self::$_elements[$index];
  }
}

LoginController.php
PHP:
class LoginController
{
  /**
   * Login Action (will be executed on {host}/login)
   * @param void
   * @return void
   * @throws Exception
   */
  public function indexAction()
  {
    // User einloggen
    $user = new User($_POST);
    if(!$user->authenticate())
      throw new Exception("Invalid Credentials.");

    // Autoloading ist aktiviert, daher ist MyRegistry einfach verfügbar
    MyRegistry::set('user', $user);
  }
}

login/index.phtml (View-Script)
PHP:
<?php
$user = MyRegistry::get('user');
echo "Hello " . $user->getName();
?>
 
Es ist nett wie du versuchst mir zu helfen und ich zu blöd bin.
Also liegt es allein an dem autoloading dass die Instanz im view ist.
Aber ich glaub du verstehst mich noch nicht ganz.

Wo wird Code mäsig eine Klasse applikationsweit gespeichert? Wie mach ich da selber ohne zend? Speichert man die Instanz dann wirklich in einer Session ?

Edit:

Ich dachte autoloading lädt ein Klasse wenn sie noch nicht verfügbar ist nach. Aber ich denke nicht sie holt eine bestehende instanz oder?
Irgendwo muss es Code mäßig eine Stelle geben wo eine eine Instanz komplett über alle darein Publik.
gemacht wird .
 
Zuletzt bearbeitet:
Zurück