2012-04-10 8 views
1

Mein Gehirn geht aus der Macht und damit meine Fähigkeit zu suchen (Ich fand keine 100% Antwort auf das, was ich suche). Davon abgesehen habe ich eine Klasse, in der eine leere statische Variable $ title enthalten ist, die ich innerhalb von __construct definieren müsste, aber sie scheint es nicht über global zu bekommen. Lassen Sie uns nur etwas Code zeigen, sollen wir?Wie definiert man eine statische Variable innerhalb eines __construct mit einem Array von außerhalb der Klasse?

$arg = array(my data is here); 
class Article 
{ 
    static $title; 

    public function __construct() 
    { 
     global $arg; 
     self::$title = $arg['title']; 
    } 

    public static function title() 
    { 
     return self::$title; 
    } 
} 

Mein Endziel wäre einfach

tun, um
echo Article::title(); 

den Titel des Artikels zu erhalten. Aber wie ich bereits erwähnt habe, habe ich kein Glück. Alle Hilfe wird geschätzt.

+4

Warum möchten Sie dieses Feld statisch sein? Warum kann es kein reguläres Klassenattribut sein? Warum verwenden Sie 'global', anstatt den Titel nur an den Konstruktor zu übergeben? – Amber

+0

Also ich müsste nicht manuell init. die Klasse jedes Mal, wenn ich es benutze. Es ist viel schöner für den Benutzer, wenn es als Artikel :: bleibt. – Chris

+2

Ich bin mir nicht sicher, ob Sie die Verwendung von Klassen und Klasseninstanzen verstehen. Wenn Sie nur eine Kopie einer Klasse benötigen, erstellen Sie einfach eine einzelne Instanz der Klasse und verwenden Sie sie. – Amber

Antwort

4

Obwohl ich mit @ Amber Kommentare einverstanden sind, können Sie tun, was Sie zu tun versuchen, aber Sie können nicht den Konstruktor für die Verwendung als Sie müssen nicht unbedingt ein Objekt instanziieren:

$arg = array(my data is here); 
class Article 
{ 
    static $title; 

    static function set_static() 
    { 
     global $arg; 
     self::$title = $arg['title']; 
    } 

    public static function title() 
    { 
     return self::$title; 
    } 
} 
Article::set_static(); 

ich auch passieren würde der Wert als Argument, aber das ändert nichts an seiner Funktionsweise.

+0

@Babas Antwort funktionierte auch, war aber etwas zu aufgebläht. Dein ist jedoch so gut wie es nur geht (ich nehme kühn an). Ich werde irgendwann etwas anders machen, aber soweit das geht, muss es reichen. Vielen Dank. – Chris

+0

@Chris Gern geschehen. – jeroen

1

Verwenden Singleton

$arg = array("title"=>" my data is here "); 
class Article 
{ 
    static $title; 
    static $instance = null ; 

    public function __construct() 
    { 
     self::$title = $GLOBALS['arg']['title']; 
    } 

    public static function getInstance() 
    { 
     if(self::$instance === null) 
     { 
      self::$instance = new self(); 
     } 

     return self::$instance; 
    } 
    public static function title() 
    { 
     self::getInstance(); 
     return self::$title; 
    } 
} 


var_dump(Article::title()); //Returns string ' my data is here ' (length=17) 
var_dump(Article::getInstance()->title()); // Returns string ' my data is here ' (length=17) 
0

Sie sollten es in erster Linie initialisieren.
Statisch $ title = ...
Die Methode --construct wird aufgerufen, wenn Sie eine Instanz neu erstellen.

0

Ich benutze eine statische Funktion, und für ineffiziente variable Lasten wir es ein privates oder geschütztes Mitglied Zugriff haben, wie folgt:

$arg = array('title' => 'My Title'); 
class Article 
{ 
    static function title() 
    { 
     global $arg; 
     return $arg['title']; 
    } 

    // or if the var load is inefficient ... 
    protected static $title_md5; 
    static function title_md5() 
    { 
     if (!isset(self::$title_md5)) 
      self::$title_md5 = md5(self::title()); 
     return self::$title_md5; 
    } 
} 
echo(
    'title = ' . Article::title() . "\n" . 
    'title_md5 = ' . Article::title_md5() . "\n" 
); 

Ausgänge:

title = My Title 
title_md5 = 5badc643b79fdda9775c45b46540afc0 
Verwandte Themen