Arasındaki fark :: ve ->

12 Cevap php

Sadece ara sıra yerel ortamda> - Ben her zaman her yerde :: ciddi projelerde insanlar kullanmak görmek ve.

> Kendimi ve asla bir sınıfın dışında statik bir değer gerektiğinde durumlarda sona - Ben sadece kullanabilirsiniz. Ben kötü bir insan mıyım?

Ben anlamak gibi ben takip deneyin ne zaman, -> çalışmaz sadece durum:

class StaticDemo {  
    private static $static  
}

$staticDemo = new StaticDemo( );

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

I :: tarafından basit genel yöntemleri demiyorlar Ama bazı programlama doğruluğu üzerinde eksik?

Ben bir örneğini oluşturmadan bir yöntemi çağırmak böylece ya da sadece bir?

12 Cevap

:: Statik özellikleri veya bir sınıfın yöntemlerini referans içindir. -> Örnek özelliklerini ve yöntemlerini referans içindir. Herhangi bir programlama doğruluğu üzerinde eksik olmayan, ve sen are Kötü bir kişi daha sonra çünkü bu değilse. Hangisini kullanmak bir sınıfın amacına bağlıdır ve nasıl yazılır. Ama aynı zamanda, PHP çok yakın zamanda bu kadar çok insan adlandırma çarpışmalarını önlemek için ad taklit statik sınıflar kendi kod kapsüllü kadar ad yoktu. O bunu yapar kodu görüyoruz mümkündür.

Eğer bir sınıf örneğini yok zaman çift kolon kullanılır

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

Eğer örneğini yoksa, kullanım ->

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

Bu http://php.net/manual/en/language.oop5.patterns.php daha ileri açıklanmıştır

Siz E_STRICT modunda sıkı standartlar uyarısına neden. Sen kötü bir insansın.

<?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();

Çıktı:

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.

-> is for an instanciated class. :: is a static call.

:: Miras kurucular kullanılan (bir çocuk ebeveyn kurucu erişme) ve başka bir yöntem içinde bir statik yönteme atıfta edilir.

Ben statik çağrıları kullanarak değil ya seni kötü bir insan yapar demek olmaz!

Evet, bir yöntem çağırmak veya bir örneğini oluşturmadan bir değere erişebilirsiniz.

Eğer bir sınıf tüm kullanım örneklerini bir değeri varsa, örneğin, yararlı olacaktır. Bu değer, ancak, app başında başlatılması gerektiğini söylüyorlar. Sen StaticDemo::static = 42; bunu başlatması gibi bir şey kullanabilirsiniz, ve sonra sınıfın tüm örnekleri erişmek mümkün olacaktır.

Onu anlamak gibi statik aynı türden nesneler arasında paylaşılır:

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

Işlevi print_test iki nesne arasında "ortak" olacak. Ancak catch) should not sınıf içinde referans şey (fonksiyon print_test olduğunu! hatta sen PHP 5 bunu kabul eder.

Örnekte fonksiyon print_test sadece "merhaba!" Yazdırır yana ve neden $ Objecta ve $ objectB bunun için bellek ayrılamadı sınıf içinde referans şey değil mi? Sadece bir static fonksiyonu yapmak ve $ Objecta ve $ objectB otomatik olarak buna işaret etmelidir.

Peki bu diğer dillerde arkasında teori, ama php5 statik bir fonksiyonu $ bu referans sağlar çünkü ({[(0 herhangi özelliklerini almak için dinamik olurdu çünkü ben onun bir gerçek statik işlev inanmıyorum )]}) benzersiz nesne.

:: Eğer hiçbir nesne örneği varsa çağrı statik yöntemler, için kullanılır.

Kullan "->" zaman nesne bağlamında ve "::" doğrudan sınıfını erişirken. Sizin örnekte olurdu:

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"

this detaylı intel için okuyun.

Ben bir örneğini oluşturmadan bir yöntemi çağırmak böylece ya da sadece bir?

Doğru.

Statik yöntemler / üyeleri çağrılırken :: (kapsam çözünürlük operatörler) kullanılır. (Eğer sizin örnekte olduğu gibi) bunu yapmak için bir örneğini oluşturmak zorunda değilsiniz.

Kullanımı - Doğru bağlamda> ve :: programlama doğruluğunu nesneye yönelik anahtarıdır. Sen sadece bir bütün olarak sınıf için geçerli zaman statik değişkenler / yöntemleri oluşturmak ve sadece sınıfın belirli bir örneğine (nesne) için olmalıdır.

Statik yöntemler ve özellikleri, bir sınıfın belirli bir örnekleme bağımsızdır. Bu çift iki nokta üst üste (::) kullanılarak erişilebilir olmalıdır. Olmayan statik yöntemleri ve özellikleri kullanılarak erişilebilir olmalıdır ->

Bu oldukça serin bazı şeyler yapmanızı sağlar. Önemsiz bir örnek sınıf mevcut örneklerinin sayısını tutan bir sayaç:

class foo {
  public static $i = 0;

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

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

Diğerleri söylediler,

  • :: 'çift kolon' statik bir özellik veya yöntem referans içindir.
  • -> 'dash ok' bir sınıf örneğinin bir özellik veya yöntem referans içindir.

Ama aynı zamanda onun değerinde olduğunu belirterek

  • Steno belirli bir sınıf (statik veya örnek olsun) ait bir özellik veya yönteme başvurmak üzere :: sık metinlerde kullanılır.

Bkz: 'belgelerinde ... Not ...': 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

Well you're right about how to use -> and ::. But sometimes it just doesn't make much sense to create objects of a class. Here's an example Compare

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

Dediğim gibi sadece bir tane gerekli her zaman var gibi make sense örneklerini oluşturmak için değildir. Bu durumda statik daha iyi uyuyor. Gerçek Objects, örneğin ile uğraşıyoruz sürece biz çoğunlukla davanın bu tür anlaşma web çıkıyor Kullanıcıların vb dolayısıyla eski yaygınlığı