【问题标题】:Whats the difference between -> and :: in OOPOOP 中 -> 和 :: 有什么区别
【发布时间】:2012-02-07 11:32:48
【问题描述】:

试图找到一些关于此的信息,但可能由于使用的字符而无法获得任何结果。

从我收集的内容来看,它们做同样的事情有什么区别。

$classname->function()
Classname::function()

第二个例子会自动实例化对象吗?

【问题讨论】:

标签: php


【解决方案1】:

前者(->)用于调用非静态成员(方法或函数/属性或变量),而后者(::)用于调用静态成员。

非静态:

class foo{
  function bar(){ echo 'test';  }
}

$foo = new foo();
$foo->bar();

静态:

class foo{
  static function bar(){ echo 'test';  }
}

foo::bar(); // no class initialization needed

查看这个问题了解更多信息:

PHP: Static and non Static functions and Objects

为了更好地理解这个概念,您应该查看what static methods are 以及它们与非静态的不同之处。

【讨论】:

  • 这对我来说真的很清楚,老实说,我不知道他们有不同的名字。非常感谢。
【解决方案2】:

不,第二个是调用静态方法。 Check here.

【讨论】:

    【解决方案3】:

    第二个示例不会自动实例化对象。因此,在第二种调用方式中,如果您在函数中使用了 $this,您将收到如下错误: PHP 致命错误:不在对象上下文中使用 $this。
    一般来说,->用来调用非静态方法,::用来调用静态方法。
    但它在 php 中并不那么严格。 例如:

    error_reporting(E_ALL);
    class A {
        public static function staticFunc() {
            echo "static";
        }
    
        public function instanceFunc() {
            echo "instance";    
        }
    }
    
    A::instanceFunc(); // echo "instance"
    $a = new A();
    $a->staticFunc();  // echo "static"
    

    上面调用的两个方法运行成功。
    因为php总是以渐进的方式实现新特性,为了保证兼容性,这可能导致一些细节不怎么在意。 但是如果你将 error_reporting 级别设置为 E_STRICT ,你会发现如下 E_STRICT 错误:
    严格标准:不应静态调用非静态方法 A::instanceFunc()

    这两种方式的唯一区别是:当你用 :: 调用一个方法时,你不能使用变量 $this 。

    但仍然建议您像在其他面向对象语言中一样严格使用这两种方式。
    您可以在http://www.php-internal.com/book/?p=chapt05/05-02-class-member-variables-and-methods获取更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 2023-03-21
      • 1970-01-01
      • 2014-06-30
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      相关资源
      最近更新 更多