PHP Sınıflar: kullanmak için :: vs ->?

6 Cevap php

"::" Ve "- ->" Ben bir PHP sınıfı erişmek için iki yol olduğunu anlıyoruz. Diğer yok iken bazen tek, benim için iş gibi görünüyor, ve ben neden anlamıyorum.

Her faydaları nelerdir, ve ya kullanmak için doğru durum nedir?

6 Cevap

Basitçe, :: class-level özellikleri için, ve -> object-level özellikleri içindir.

Özellik sınıfına aitse, kullanmak ::

Özelliği an instance of the class, kullanımı aitse ->

class Tester
{
  public $foo;
  const BLAH;

  public static function bar(){}
}

$t = new Tester;
$t->foo;
Tester::bar();
Tester::BLAH;

"::" Sembolü static anahtar sözcüğü ile bildirilmiş olan bir nesnenin yöntemleri / özelliklerine erişmek için, "->" örnek yöntemleri / özelliklerini temsil bir nesnenin yöntemleri / özelliklerine erişmek içindir.

Bir sınıfı bildirirken, varsayılan 'statik' gereğidir. Sen :: operatörü ve herhangi bir kapsam içinde kullanarak bu sınıfta herhangi bir yöntemi erişebilirsiniz. Bu bir lib sınıf oluşturmak, ben istediğiniz her yerde bunu erişebilir ve globaled olması gerekmez anlamına gelir:

class lib
{
    static function foo()
    {
       echo "hi";
    }
}
lib::foo(); // prints hi

Eğer new anahtar sözcüğünü kullanarak bu sınıfın bir örneğini oluşturduğunuzda, sınıfın belirli örneğe başvuruyorsunuz çünkü Şimdi, sen, -> yöntemleri ve değerlerine erişmek için kullanın. Sen inside of olarak -> düşünebilirsiniz. IE (Not Eğer statik anahtar kaldırmanız gerekir):

class lib
    {
        function foo()
        {
           echo "hi";
        }
    }
$class = new lib;
$class->foo(); // I am accessing the foo() method INSIDE of the $class instance of lib.

Her statik işlev, aynı zamanda sınıfının bir örneği değil, çevresindeki diğer yolu kullanarak denebilecek da unutulmamalıdır.

Yani bu işleri:

class Foo
{
  public static function bar(){}
}

$f = new Foo();
$f->bar(); //works
Foo::bar(); //works

Ve bu değil:

class Foo
{
  protected $test="fddf";
  public function bar(){ echo $this->test; }
}

$f = new Foo();
$f->bar(); //works
Foo::bar(); //fails because $this->test can't be accessed from a static call

Örneği başlatılırken bellek maliyeti değil, aynı zamanda çok mantıklı değil çünkü sadece tabii ki, statik bir şekilde statik yöntemler arayarak kendinizi sınırlamak gerekir.

Bu açıklama sizin için zamanlarda bazı çalıştı neden göstermek için esas oldu.

Kaynak WikiPedia - Class

In object-oriented programming, a class is a programming language construct that is used as a blueprint to create objects. This blueprint describes the state and behavior that the created objects all share. An object created by a class is an instance of the class, and the class that created that instance can be considered as the type of that object, e.g. a type of an object created by a "Fruit" class would be "Fruit".

:: operatör sınıfı yöntemlerini ve static anahtar sözcüğünü kullanarak php tanımlanır özellikler erişir. Class const de kullanılarak erişilir ::

-> operatörü yöntemleri ve sınıfının bir örneği özelliklerini erişir.

Işlevi bir örnek üzerinde çalışır ise, -> kullanarak olacak. O sınıfın kendisi üzerinde çalışır, kullandığınız :: olacak

Eğer parent işlevleri çağırmak istediğiniz zaman başka bir kullanımı :: olacaktır. Bir sınıf devralır, başka - bu ana sınıfından yöntemlerini geçersiz olabilir, daha sonra kullanarak onları aramak parent::function()

Php okumak this. Gereken bu konuda kafa karıştırıcı olabilir

Ne de kafa karıştırıcı oluyor size :: sembolü olmayan statik işlevleri çağırabilirsiniz olmasıdır. Java gelen bu çok garip. Ben ilk gördüğümde ve kesinlikle beni şaşırttı.

Örneğin:

class Car
{
    public $name = "Herbie <br/>";

    public function drive()
    {
        echo "driving <br/>";
    }

    public static function gas()
    {
        echo "pedal to the metal<br/>";
    }
} 

Car::drive(); //will work
Car::gas(); //will work

$car = new Car();
$car->drive(); // will work
$car->gas(); //will work

echo $car->name; // will work
echo Car::$name; // wont work error

Eğer statik Gördüğünüz gibi php çok gevşek. > Ve :: sembolleri - Ve her iki ile herhangi bir fonksiyonu çağırabilirsiniz. Eğer ile çağırdığınızda Ama bir fark var :: hiçbir $ örneğine bu referans var. Örneğin 1. bakın manual.