2010-05-10 2 views
14

Ich sehe immer Menschen in seriösen Projekten verwenden :: überall, und -> nur gelegentlich in der lokalen Umgebung.Unterschied zwischen :: und -> in PHP

Ich verwende nur -> mich selbst und komme nie in Situationen, in denen ich einen statischen Wert außerhalb einer Klasse brauche. Bin ich ein schlechter Mensch?

Wie ich verstehe, ist die einzige Situation, wenn -> nicht ist arbeiten, wenn ich versuche folgendes:

class StaticDemo { 
    private static $static 
} 

$staticDemo = new StaticDemo(); 

$staticDemo->static; // wrong 
$staticDemo::static; // right 

Aber bin ich auf einige Programmier Korrektheit fehlt, wenn ich nicht einfach öffentliche Methoden von :: rufen Sie ?

Oder ist es nur so, dass ich eine Methode aufrufen kann, ohne eine Instanz zu erstellen?

+14

"Bin ich ein schlechter Mensch?" LOL –

+2

Sie sind eine schlechte Person, weil Sie arme Klasse instanziiert haben, um nur ihr statisches Feld zu nennen. – doc

+0

möglich Duplikat von [Unterschied zwischen "->" und "::" in PHP MySQLi OOP] (http://stackoverflow.com/questions/1245121/difference-between-and-in-php-mysqlioop) – Sarfraz

Antwort

7

:: ist für statische Eigenschaften oder Methoden einer Klasse verweisen. -> dient zum Verweisen auf Instanzeigenschaften und Methoden. Sie verpassen keine Programmierungskorrektheit, und wenn Sie eine schlechte Person sind, dann ist es nicht deswegen. Welche Sie verwenden, hängt vom Zweck Ihrer Klasse ab und davon, wie sie geschrieben ist. Aber auch PHP hatte bis vor kurzem keine Namespaces, so dass viele Leute ihren Code in statische Klassen einkapselten, um Namespaces zu emulieren, um Namenskollisionen zu vermeiden. Es ist möglich, dass Sie Code sehen, der das tut.

12

Der doppelte Doppelpunkt verwendet, wenn Sie keine Klasse

class StaticDemo {...}; 
StaticDemo::static 

instanziiert, wenn Sie instanziieren, Gebrauch ->

class StaticDemo {...}; 
$s = new StaticDemo(); 
$s->static; 

Diese weitere bei http://php.net/manual/en/language.oop5.patterns.php erklärt

+13

Sie haben immer noch nicht geantwortet, ob er ein schlechter Mensch ist oder nicht. Ich persönlich glaube, das ist die Hauptfrage. Sie haben einfach die sekundären Fragen beantwortet. : P –

+3

Keine schlechte Person, zumindest nicht so schlecht wie die Person, die mich ohne Erklärung abstimmte. Wie kann ich mich verbessern? –

2

Ja, Sie können eine Methode aufrufen oder auf einen Wert zugreifen, ohne eine Instanz zu erstellen.

Es wäre zum Beispiel nützlich, wenn Sie einen Wert haben, den alle Instanzen einer Klasse verwenden. Angenommen, dieser Wert muss jedoch am Anfang Ihrer App initialisiert werden. Sie könnten etwas wie StaticDemo::static = 42; verwenden, um es zu initialisieren, und dann könnten alle Instanzen Ihrer Klasse darauf zugreifen.

1

:: wird für statische Methoden verwendet, die Sie aufrufen, wenn Sie keine Objektinstanz haben.

3

-> ist für eine instanziierte Klasse. :: ist ein statischer Anruf.

:: wird in Vererbungskonstruktoren verwendet (ein Kind, das auf einen übergeordneten Konstruktor zugreift) und wenn es sich auf eine statische Methode in einer anderen Methode bezieht.

Ich würde nicht sagen, nicht mit statischen Aufrufen machen Sie auch eine schlechte Person!

1

Statische Methoden und Eigenschaften sind unabhängig von einer bestimmten Instanziierung einer Klasse. Auf diese muss mit doppelten Doppelpunkten (: :) zugegriffen werden. Auf nicht statische Methoden und Eigenschaften sollte unter Verwendung von ->

zugegriffen werden. Dies ermöglicht es Ihnen, einige ziemlich coole Dinge zu tun. Ein einfaches Beispiel ist ein Zähler, der die Anzahl von Instanzen der Klasse hält vorhanden:

class foo { 
    public static $i = 0; 

    public function __construct() { 
    self::$i++; 
    } 
} 

$a = new foo(); 
$b = new foo(); 
echo foo::$i; 
// outputs 2 
1

Use „->“, wenn sie in Objektkontext und „::“, wenn sie direkt die Klasse zugreifen. In Ihrem Beispiel, das wäre:

class StaticDemo { 
    public static $staticVar = 'blabla'; 
    public $normalVar = 'foobar'; 
} 

$foo = new StaticDemo(); 
echo $foo->normalVar; //object context, echoes "foobar" 
echo StaticDemo::staticVar; //class or "static" context, echoes "blabla" 

lesen this für detaillierte Intel.

1

Oder ist es nur so, dass ich eine Methode aufrufen kann, ohne eine Instanz zu erstellen?

Korrekt.

Die :: (Bereichsauflösungs Operatoren) verwendet werden, wenn statische Methoden/Mitglieder aufrufen. Sie müssen dazu keine Instanz erstellen (wie in Ihrem Beispiel).

Verwendung -> und :: im richtigen Kontext ist der Schlüssel zur Programmierung Korrektheit objektorientiert. Sie sollten nur statische Variablen/Methoden erstellen, wenn sie auf die Klasse als Ganzes und nicht nur auf eine bestimmte Instanz (Objekt) der Klasse angewendet werden.

0

Nun haben Sie Recht über die Verwendung -> und ::. Aber manchmal macht es einfach nicht viel Sinn, um Objekte einer Klasse zu erstellen. Hier ist ein Beispiel Vergleichen

class Settings 
{ 
    public static $setting1; 
    public static $setting2; 
    ... // lots of other vars and functions 
} 
if(Setting::$setting1) 
    //do something 

vs

class Settings 
{ 
    public $setting1; 
    public $setting2; 
    ... // lots of other vars and functions 
} 
$set = new Settings() 
if($set->setting1) 
    //do something 

Wie gesagt Es ist nicht sinnvoll Instanzen zu erstellen, wie es immer nur eine erforderlich. In diesem Fall passt statisch besser. Es stellt sich im Web heraus, dass wir uns meistens mit dieser Art von Fall beschäftigen, es sei denn, Sie haben es mit echten Objekten, z. Benutzer etc daher die Prävalenz der ehemaligen

4

Sie verursachte einen strengen Standards in E_STRICT Warnmodus. Du bist ein schlechter Mensch.

<?php 

error_reporting(E_ALL | E_STRICT); 

header('Content-type: text/plain'); 

class Foo { 
    public $msg = "Hello, public.\n"; 
    public static $msgStatic = "Hello, static.\n"; 

    public function write() { 
     echo "Hello, write.\n"; 
    } 

    public static function writeStatic() { 
     echo "Hello, writeStatic.\n"; 
    } 
} 

//echo Foo::$msg; // Fatal error: Access to undeclared static property: Foo::$msg 
echo Foo::$msgStatic; 
echo Foo::write(); // Strict Standards: Non-static method Foo::write() should not be called statically 
echo Foo::writeStatic(); 

echo "------------------------\n"; 

$f = new Foo; 
echo $f->msg; 
echo $f->msgStatic; // Strict Standards: Accessing static property Foo::$msgStatic as non static 
        // Notice: Undefined property: Foo::$msgStatic 
echo $f->write(); 
echo $f->writeStatic(); 

Ausgang:

Hello, static. 

Strict Standards: Non-static method Foo::write() should not be called statically in /home/adam/public_html/2010/05/10/bad.php on line 22 
Hello, write. 
Hello, writeStatic. 
------------------------ 
Hello, public. 

Strict Standards: Accessing static property Foo::$msgStatic as non static in /home/adam/public_html/2010/05/10/bad.php on line 29 

Notice: Undefined property: Foo::$msgStatic in /home/adam/public_html/2010/05/10/bad.php on line 29 
Hello, write. 
Hello, writeStatic. 
1

Wie andere gesagt haben,

  • :: 'Doppelpunkt' ist für eine statische Eigenschaft oder Methode verweisen.
  • -> 'Strichpfeil' verweist auf eine Eigenschaft oder Methode einer Klasseninstanz.

Aber auch erwähnenswert, dass seine

  • :: häufig in Texten als Abkürzung verwendet wird, um eine Eigenschaft oder eine Methode zu finden, die zu einer bestimmten Klasse gehört (ob es statisch oder Instanz ist).

Siehe ‚Hinweis ... in der Dokumentation ...

class test{ 
    static function print_test(){ 
     print "hello!"; 
    } 
} 
$objectA = new test(); 
$objectB = new test(); 

Die Funktion print_test wird ‚geteilt‘ zwischen den beiden Objekten: ': zwischen Objekten des gleichen Typs freigegeben ist http://books.google.co.uk/books?id=qVLjFk_4zVYC&lpg=PA66&dq=php%205%20objects&pg=PA46#v=onepage&q=php%205%20objects&f=false

2

Wie ich es die statische verstehen. Aber der Haken ist die Funktion print_test() sollte nicht Bezug alles in der Klasse! Sogar PHP 5 akzeptiert es.

Da die Funktion print_test im Beispiel nur "Hallo!" und referenziert nichts innerhalb der Klasse, warum Speicher dafür in $ objectA und $ objectB zuweisen? Machen Sie einfach eine statische Funktion und $ objectA und $ objectB sollte darauf automatisch zeigen.

Nun, das ist die Theorie dahinter in anderen Sprachen, aber da PHP5 Ihnen erlaubt, $ dies in einer statischen Funktion zu referenzieren, glaube ich nicht, dass es eine echte statische Funktion ist, da es dynamisch sein müsste, um Eigenschaften für ($ this-> Variable) dieses einzigartige Objekt.