2011-01-12 8 views
1

Ich habe eine Klasse erstellt, die ein Objekt in "__construct" aufruft, wie kann ich dieses Objekt über die Klasse hinweg verfügbar machen.wie man ein Objekt für alle Funktionen in einer Klasse öffentlich macht?

class SocialMedia { function __construct() { $object = "whatever"; } } 

Wie kann ich auf $ -Objekt in den anderen Funktionen (die statisch sind) von mit in der Klasse zugreifen. Ich habe versucht, "$ this-> Objekt" zu verwenden, aber ich bekomme einen Fehler "$ this wenn nicht im Objekt Kontext", wenn ich versuche, es von meinen anderen statischen Funktionen aufzurufen.

+0

Ich habe auch versucht, $ Objekt öffentlich zu machen, kann aber immer noch nicht auf das Objekt zugreifen. –

Antwort

5

Verwenden

self::$object = 'whatever' 

statt und lesen Sie die PHP Manual on the static keyword

Auf Nebenbei bemerkt, statics are death to testability, so dass Sie vielleicht war gerade gut vergessen, was Sie gerade gelernt haben und stattdessen Instanzvariablen verwenden.

+0

danke für den Link, es war eine gute Lektüre. Ich habe 'was auch immer' als Beispiel benutzt. wirklich initialisiere ich eine class/lib (facebooks sdk), die nur einmal in einem Skriptlauf instanziiert werden kann. –

+0

@thesocialhacker dann tun Sie das in Ihrer Bootstrap-Datei und übergeben Sie die Instanz an alle Objekte, die sie benötigen. Dies wird Dependency Injection genannt und es wird Ihre Anwendung auf lange Sicht viel wartbarer machen. – Gordon

+0

danke, ich werde das an unseren Lead-Entwickler weitergeben. Sehen Sie, ob er irgendwelche Ideen hat, wie ich das anders handhaben soll. –

2

Versuchen Sie, Ihr Objekt innerhalb des Bereichs der Klasse zu definieren, direkt über der Funktion. So, als ein Beispiel:

Oder Sie könnten versuchen, es als "öffentliche statische" statt nur "öffentlich" zu definieren. Als Beispiel dieses:

class SocialMedia { public static $object; function __construct() { $object = "whatever"; } } 
1

Wenn $object ist nicht statisch, dann haben Sie ein Problem. Sie müssen in der Lage sein, auf eine bestimmte Instanz der Klasse zu verweisen. Youll müssen die tatsächlichen Instanz von Socialmedia seiner statischen Methode oder kommen mit einigen anderen Spielereien weitergeben müssen:

public static function someMethod(SocialMedia $instance, $args) 
{ 
    // do stuff with $instance->object and $args 
} 

public function methodThatUsesStaticMethod($args) 
{ 
    self::someMethod($this, $args); 
} 

Wenn $object statisch ist, dann können Sie den Bereichsauflösungsoperator verwenden, darauf zuzugreifen, wie andere schon erwähnt haben:

public static $object; 

public static function someMethod($args) 
{ 
    $object = self::$object; 
    // do stuff with $object and $args 
} 

Aber dann haben Sie eine andere Frage ... Was passiert, wenn keine Instanz von SocialMedia noch erstellt worden und so ist SocialMedia::$object noch nicht festgelegt?

2

machen es statisch:

class SocialMedia { 

    protected static $object; 

    function __construct() { 
     self::$object = "whatever"; 
    } 
} 
0

Sie können Ihre Klasse ein Singleton (OOP Patterns in PHP Manual) machen, aber das ist nun wirklich keine bessere Lösung, wenn Sie Testbarkeit und/oder Dependency Injection wollen. Egal, wie Sie es anziehen, Sie sind hinter einer globalen Variable her und früher oder später werden Sie alle Schwierigkeiten herausfinden, die sie bringen.

Verwandte Themen