2016-11-03 4 views
0

Ich habe ein Problem in meiner Klasse, wo die static private Variable innerhalb einer Funktion verwendet wird, funktioniert nicht. Aber es funktioniert, wenn die Regex direkt darin ist.

class Object{ 
    static private $regex = "/\w+|\-\d+/"; 

    //does not work (NULL) 
    public function tokenize($text){ 
    preg_match_all($this->regex, $text, $matches); 
    var_dump($matches); 
    } 

    //works 
    public function tokenize($text){ 
    $regex = "/\w+|\-\d+/"; 
    preg_match_all($regex, $text, $matches); 
    var_dump($matches); 
    } 
} 

$o = New Object; 
$o->tokenize("test text -123"); 
+0

Bitte beginnen Sie, Antworten zu akzeptieren. Ich spreche nicht über diese Frage im Besonderen, aber die meisten Ihrer Fragen, wo Sie gute Antworten haben ... –

Antwort

1

Ab the docs:

Deklarieren Klasse Eigenschaften oder Methoden als statisch, ohne sie zugänglich macht eine Instanziierung der Klasse zu benötigen. Auf eine Eigenschaft, die als statisch deklariert ist, kann nicht mit einem instanziierten Klassenobjekt zugegriffen werden (obwohl eine statische Methode dies kann).

Um die private static Eigenschaft von nicht static Kontext innerhalb der Klasse zugreifen, wie Sie dieses Recht jetzt versuchen zu tun, können Sie es mit

self::$regex 

zugreifen sollen Oder Sie könnten Ihre $regex Eigenschaft neu deklarieren zu sein Nur private (nicht static) und dann können Sie darauf zugreifen wie $this->regex

1

Sie erklärt die Regex var als static (und es ist ein $ fehlt, aber ich denke, dass ein anderer Fehler ist). Auf statische vars kann nicht als Objektattribute zugegriffen werden ($this->regex), aber es funktioniert als $ regex, weil Sie es direkt im Rahmen der zweiten Funktion definieren.

So können Sie das Problem beheben, indem Sie den Modifizierer static entfernen, wenn Sie es als Attribut verwenden möchten. Andernfalls können Sie self::$regex oder Object::$regex verwenden, um statisch von jedem Ort innerhalb des Objekts (letzteres auch außerhalb des Objekts, aber nur wenn es öffentlich ist) darauf zuzugreifen.

+0

ja, die 'statische private regex' war ein Fehler, behoben es' static private $ Regex' aber tun 'preg_match_all ($ regex ... 'anstelle von' $ this-> regex' mit 'static' funktioniert nicht. das Entfernen von' static' macht zwar – Drew

+0

Ich habe meine Antwort bearbeitet, um sie zu verdeutlichen. Wenn du sie wirklich statisch behalten und darauf zugreifen willst, Sie können Object :: $ regex verwenden –