PHP类:何时使用:: vs. - >?

时间:2009-08-03 21:46:36

标签: php class

我知道有两种方法可以访问PHP类 - “::”和“ - >”。有时一个似乎对我有用,而另一个没有,我不明白为什么。

每种方法的好处是什么,以及使用它们的正确情况是什么?

7 个答案:

答案 0 :(得分:58)

简而言之,::适用于类级别属性,->适用于对象级属性。

如果属性属于该类,请使用::

如果属性属于类的实例,请使用->

class Tester
{
  public $foo;
  const BLAH;

  public static function bar(){}
}

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

答案 1 :(得分:8)

“::”符号用于访问已使用static关键字“ - >”声明的对象的方法/属性用于访问表示实例方法/属性的对象的方法/属性。

答案 2 :(得分:4)

声明一个类时,它默认为“static”。您可以使用::运算符以及任何范围访问该类中的任何方法。这意味着如果我创建一个lib类,我可以在任何我想要的地方访问它,它不需要被全局化:

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

现在,当您使用new关键字创建此类的实例时,使用->来访问方法和值,因为您指的是该类的特定实例。您可以将->视为inside of。 (注意,你必须删除静态关键字)IE:

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

答案 3 :(得分:3)

Php在这方面可能令人困惑,你应该阅读this

令人困惑的是,您可以使用::符号调用非静态函数。当你来自Java时,这很奇怪。当我第一次看到它时,它确实让我感到惊讶。

例如:

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

正如你所看到的,静态在php中非常松散。你可以使用 - &gt;调用任何函数和::符号。但是当你调用::没有$这个对实例的引用时会有区别。请参阅manual中的示例#1。

答案 4 :(得分:1)

还应该注意,每个静态函数也可以使用类的实例调用,但不能相反。

这样可行:

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

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

这不是:

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

当然,您应该限制自己以静态方式调用静态方法,因为实例化实例不仅会花费内存,而且也没有多大意义。

这个解释主要是为了说明为什么它在某些时候适合你。

答案 5 :(得分:1)

::用于访问类的静态属性。 ->用于访问类实例(对象的)属性。

请考虑此Product类,该类具有两个用于检索产品详细信息的功能。一个函数getProductDetails属于一个类的实例,而另一个getProductDetailsStatic仅属于该类。

class Product {
  protected $product_id;

  public function __construct($product_id) {
    $this->product_id = $product_id;
  }

  public function getProductDetails() {
     $sql = "select * from products where product_id= $this->product_id ";
     return Database::execute($sql);
  }

  public static function getProductDetailsStatic($product_id) {
     $sql = "select * from products where product_id= $product_id ";
     return Database::execute($sql);
  }
}

让我们获取产品:

$product = new Product('129033'); // passing product id to constructor
var_dump( $product->getProductDetails() ); // would get me product details

var_dump( Product::getProductDetailsStatic('129033') ); // would also get me product details

何时使用Static properties

考虑可能不需要实例化的此类:

class Helper {
  static function bin2hex($string = '') {
  }
  static function encryptData($data = '') {
  }
  static function string2Url($string = '') {
  }
  static function generateRandomString() {
  }
}

答案 6 :(得分:0)

采购WikiPedia - Class

  

在面向对象的编程中,a   class是一种编程语言   构造用作蓝图   创建对象。这个蓝图   描述了那种状态和行为   创建的对象全部共享。一个   由类创建的对象是   类的实例和类   创建该实例的可以   被视为该对象的类型,   例如一种由a创建的对象   “水果”课程将是“水果”。

::运算符使用static关键字访问php中定义的类方法和属性。也可以使用const

访问班级::

->运算符访问类的实例的方法和属性。

如果该功能在某个实例上运行,您将使用->。如果它在类本身上运行,您将使用::

::的另一个用途是当您想要调用parent函数时。如果一个类继承另一个类 - 它可以覆盖父类的方法,然后使用parent::function()

调用它们