::(双冒号)和 - >之间有什么区别? (箭头)用PHP?

时间:2010-07-04 02:17:37

标签: php

在PHP中访问方法有两种不同的方法,但有什么区别?

$response->setParameter('foo', 'bar');

sfConfig::set('foo', 'bar');

我假设->(带有大于号或破坏号的破折号)用于变量的函数,::(双冒号)用于类的函数。正确的吗?

=>赋值运算符仅用于在数组中分配数据吗?这与用于实例化或修改变量的=赋值运算符形成对比吗?

6 个答案:

答案 0 :(得分:164)

当左侧部分是对象实例时,您使用->。否则,您使用::

这意味着->主要用于访问实例成员(虽然它也可以用于访问静态成员,但不鼓励这样使用),而::通常用于访问静态成员(虽然在一些特殊情况下,它用于访问实例成员。)

一般来说,::用于scope resolution,它可能有类名,parentself或(在PHP 5.3中){{1在它的左边。 static指的是使用它的类的超类的范围; parent指的是使用它的类的范围; self指的是“被叫范围”(请参阅​​late static bindings)。

规则是,当且仅当:{/ p>时,static的呼叫才是实例调用

  • 目标方法未声明为静态
  • 在调用时有一个兼容的对象上下文,这意味着必须为true:
    1. 通过::存在且
    2. 的上下文进行调用
    3. $this的类要么被调用的方法的类,要么是它的子类。

示例:

$this

输出:

B::$prop_static: B::$prop_static value
B::func_static(): in B::func_static

$b->prop_instance: B::$prop_instance value
$b->func_static(): in B::func_static

$b->func_instance():
in B::func_instance
in A::func_instance
in A::func_instance

$a->dyn():
in A::callDynamic
in dynamic dyn (__callStatic)

$b->dyn():
in A::callDynamic
in dynamic dyn (__call)

答案 1 :(得分:48)

::用于静态上下文,即。当某个方法或属性声明为static时:

class Math {
    public static function sin($angle) {
        return ...;
    }
}

$result = Math::sin(123);

此外,当您调用父类的方法/属性时,::运算符(范围解析运算符,a.k.a Paamayim Nekudotayim)将用于动态上下文中:

class Rectangle {
     protected $x, $y;

     public function __construct($x, $y) {
         $this->x = $x;
         $this->y = $y;
     }
}

class Square extends Rectangle {
    public function __construct($x) {
        parent::__construct($x, $x);
    }
}

->用于动态上下文,即。当你处理某个类的某个实例时:

class Hello {
    public function say() {
       echo 'hello!';
    }
}

$h = new Hello();
$h->say();

顺便说一下:当你没有任何OOP经验时,我不认为使用Symfony是个好主意。

答案 2 :(得分:22)

实际上,通过这个符号,我们可以调用一个静态的类方法,而不依赖于其他初始化......

class Test {

    public $name;

    public function __construct() {
        $this->name = 'Mrinmoy Ghoshal';
    }

    public static function doWrite($name) {
        print 'Hello '.$name;
    }

    public function write() {
        print $this->name;
    }
}

这里doWrite()函数不依赖于任何其他方法或变量,它是一个静态方法。这就是为什么我们可以通过这个操作符调用这个方法而不初始化这个类的对象。

Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.

但是如果你想以这种方式调用write方法,它将产生一个错误,因为它依赖于初始化。

答案 3 :(得分:15)

=>运算符用于在关联数组中分配键值对。例如:

$fruits = array(
  'Apple'  => 'Red',
  'Banana' => 'Yellow'
);

它的含义在foreach声明中类似:

foreach ($fruits as $fruit => $color)
  echo "$fruit is $color in color.";

答案 4 :(得分:13)

静态和实例化方法和属性之间的区别似乎是那些刚刚开始使用PHP 5中的OOP PHP的最大障碍之一。

静态上下文调用对象或属性时,使用双冒号运算符(来自希伯来语称为Paamayim Nekudotayim - trivia)。这意味着尚未创建对象的实例。

相反,箭头操作符调用来自对象实例引用的方法或属性。

静态方法在链接到create和delete方法的数据库的对象模型中特别有用,因为您可以将返回值设置为inserted表id,然后使用构造函数按行id实例化对象。

答案 5 :(得分:1)

是的,我刚刚点击了'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'。我的不好,我的$instance::method()应该是$instance->method()。傻我。

奇怪的是,这仍然适用于我的本地计算机(运行PHP 5.3.8) - 没有,甚至没有带有error_reporting = E_ALL的警告 - 但在测试服务器上根本没有,它只是爆炸了浏览器中出现语法错误和白屏。由于在测试机器上关闭了PHP日志记录,并且托管公司太忙而无法打开它,因此不太明显。

所以,警告:显然,一些PHP安装会让你使用$ instance :: method(),而其他人则没有。

如果有人可以扩展原因,请执行。