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

joh*_*ack 23 php class

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

每种方法的好处是什么,使用哪种方式都是正确的?

Pet*_*ley 59

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

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

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

class Tester
{
  public $foo;
  const BLAH;

  public static function bar(){}
}

$t = new Tester;
$t->foo;
Tester::bar();
Tester::BLAH;
Run Code Online (Sandbox Code Playgroud)

  • @jonnietheblack:没有*应该*,这是你想要做的事情.如果你想使用一个可以传递,复制,克隆等的对象,你可以从Class中实例化Object(使用`new Class`),然后使用` - >`在Object中使用.如果你没有实例化一个Object,只是想"按原样"调用类函数,那么你使用`::`.这实际上取决于你对Class的使用,一种方法并不比另一种方法好. (2认同)
  • 换句话说:`$ object-> func()`没关系,注意`$ object`是一个变量,即它被实例化了.`ClassName :: func()`也没关系,请注意`ClassName`不是变量,它只是类名.`$ object :: func()`不好,你试图在实例化的对象上静态调用一个方法.`ClassName-> func()`对于相反的原因也没有好处. (2认同)

Cod*_*lan 8

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

  • 说'使用static关键字'有点不对劲.这不是唯一的情况 - 访问父方法和常量都需要`::`运算符,两者都不必声明为static. (7认同)

MrH*_*Hus 6

PHP 在这方面可能会令人困惑,您应该阅读此内容

同样令人困惑的是,您可以使用 :: 符号调用非静态函数。当你来自 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,静态在 php 中是非常宽松的。您可以使用 -> 和 :: 符号调用任何函数。但是当您使用 :: 调用时有一个区别,没有 $this 对实例的引用。请参阅手册中的示例#1 。


Tyl*_*ter 5

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

class lib
{
    static function foo()
    {
       echo "hi";
    }
}
lib::foo(); // prints hi
Run Code Online (Sandbox Code Playgroud)

现在,当您使用关键字创建此类的实例时new,您可以->访问方法和值,因为您引用的是该类的特定实例。你可以认为->inside of。(注意,必须去掉static关键字)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.
Run Code Online (Sandbox Code Playgroud)