2013-03-12 14 views
7

Ich habe in letzter Zeit mein PHP-Spiel verstärkt. Aus JavaScript kommend, habe ich festgestellt, dass das Objektmodell ein wenig einfacher zu verstehen ist.PHP-Eigenschaft Zugriff und Dollarzeichen

Ich bin in ein paar Macken geraten, dass ich etwas klären wollte, das ich nicht in der Dokumentation finden kann.

Wenn Klassen in PHP definieren, können Sie Eigenschaften wie so definieren:

class myClass { 

    public $myProp = "myProp"; 
    static $anotherProp = "anotherProp"; 

} 

Mit der öffentlichen Variable $myProp wir es zugreifen können (vorausgesetzt, myClass in einer Variablen referenziert wird genannt $myClass) $myClass->myProp ohne den Einsatz des Dollarzeichens.

Wir können nur auf statische Variablen mit :: zugreifen. So können wir auf die statische Variable wie $myClass::$anotherProp mit einem Dollarzeichen zugreifen.

Frage ist, warum müssen wir Dollarzeichen mit :: und nicht -> ??

EDIT

Dies ist Code, den ich arbeiten würde annehmen würde (und tut):

class SethensClass { 

    static public $SethensProp = "This is my prop!"; 

} 

$myClass = new SethensClass; 
echo $myClass::$SethensProp; 
+1

Interessant ... Eine Upvote und eine Close-Anfrage. – Sethen

+0

Entschuldigung dafür, hier über [Ihre andere Frage] (http://stackoverflow.com/q/17681253/20578) zu kommentieren (was, wenn ich als eine Reihe von individuellen Fragen gefragt würde, hätte ich persönlich gedacht, wäre gut gewesen - siehe zB http: //stackoverflow.com/questions/15270843/what-does-plus-operator-mean-in-underscore-js), aber etwas wie "Best Practice sagt, dies zu tun" ist ein bisschen bedeutungslos. Wenn Sie nicht erklären können, warum Sie denken, dass etwas eine "Best Practice" ist, woher wissen Sie dann, dass es "das Beste" ist? Verschiedene Dinge sind am besten in verschiedenen Situationen. –

+0

@ PaulD.Waite Es ist in Ordnung. Als Entwickler, der versucht, mit seiner Entwicklung voranzukommen, ist es in meinen Augen akzeptabel, Fragen darüber zu stellen, ob eine bestimmte Bibliothek Best Practices zum Lernen beibringt. Für die Gemeinschaft als Ganzes ist das nicht sehr frustrierend. Ich glaube nicht, dass eine bestimmte Bibliothek mit Best Practices geschrieben wurde, und ich versuche sicherzustellen, dass es etwas ist, was ich nicht falsch mache. Wenn ich also Code beisteuere, kann ich sicher sein, dass es das Beste ist. – Sethen

Antwort

14

A class constant mit dem :: Bereichsoperator zugegriffen wird, und kein Dollarzeichen, so dass die $ wird dort benötigt, um zwischen statischen Klasseneigenschaften und Klassenkonstanten zu unterscheiden.

class myClass { 
    public static $staticProp = "static property"; 

    const CLASS_CONSTANT = 'a constant'; 
} 

echo myClass::CLASS_CONSTANT; 
echo myClass::$staticProp; 

So eine Variable zuzugreifen, ist die $ notwendig. Aber die $ kann nicht am Anfang des Klassennamens wie $myClass::staticProp platziert werden, weil dann der Klassenname nicht vom Parser identifiziert werden konnte, da es auch möglich ist, eine Variable als Klassenname zu verwenden. Es muss daher an der Immobilie befestigt werden.

$myClass = "SomeClassName"; 
// This attempts to access a constant called staticProp 
// in a class called "SomeClassName" 
echo $myClass::staticProp; 

// Really, we need 
echo myClass::$staticProp; 
+0

+1 schlage mich darauf –

+0

'$ myClass' soll $ myClass = new myClass' darstellen. – Sethen

+0

Dann macht es keinen Sinn. $ staticProp ist eine Klassenvariable, keine Instanzvariable, daher kann sie nicht von einer Klasseninstanz aufgerufen werden. –

0

seine Gierig!

Manchmal ist es sinnvoll, auf Funktionen und Variablen in Basisklassen zu verweisen oder sich auf Funktionen in Klassen zu beziehen, die noch keine Instanzen haben. Der Operator :: wird dafür verwendet.

<?php 
class A 
{ 
    function example() 
    { 
     echo "I am the original function A::example().<br>\n"; 
    } 
} 

class B extends A 
{ 
    function example() 
    { 
     echo "I am the redefined function B::example().<br>\n"; 
     A::example(); 
    } 
} 

// there is no object of class A. 
// this will print 
// I am the original function A::example().<br> 
A::example(); 

// create an object of class B. 
$b = new B; 

// this will print 
// I am the redefined function B::example().<br> 
// I am the original function A::example().<br> 
$b->example(); 
?> 

Das obige Beispiel ruft die Funktion example() in der Klasse A, aber es gibt kein Objekt der Klasse A, so dass wir a- $ nicht schreiben können> example() oder ähnliches. Statt dessen nennen wir beispiel() als eine 'Klassenfunktion', dh als Funktion der Klasse selbst, kein Objekt dieser Klasse.

Es gibt Klassenfunktionen, aber keine Klassenvariablen. Tatsächlich gibt es zum Zeitpunkt des Anrufs überhaupt kein Objekt. Daher kann eine Klassenfunktion keine Objektvariablen verwenden (sie kann jedoch lokale und globale Variablen verwenden), und sie kann $ gar nicht verwenden.

Im obigen Beispiel definiert Klasse B die Funktion example() neu. Die ursprüngliche Definition in Klasse A ist beschattet und nicht mehr verfügbar, es sei denn, Sie beziehen sich speziell auf die Implementierung von example() in Klasse A mit dem Operator :: -.Schreiben Sie A :: Beispiel(), um dies zu tun (in der Tat sollten Sie schreiben Eltern :: Beispiel()).

In diesem Kontext gibt es ein aktuelles Objekt und möglicherweise Objektvariablen. Wenn Sie also von WITHIN einer Objektfunktion aus verwendet werden, können Sie $ this und Objektvariablen verwenden.

Verwandte Themen