Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ->;和::在OOP中_Php - Fatal编程技术网

Php ->;和::在OOP中

Php ->;和::在OOP中,php,Php,试图找到一些信息,但我无法得到任何结果,可能是由于使用的字符 从我收集到的信息来看,以下两者之间的区别是什么?它们做的是相同的事情 $classname->function() Classname::function() 第二个示例是否自动实例化对象?否,第二个示例正在调用静态方法 前者(->)用于调用非静态成员(方法或函数/属性或变量),而后者(:)用于调用静态成员 非静态: class foo{ function bar(){ echo 'test'; } } $foo =

试图找到一些信息,但我无法得到任何结果,可能是由于使用的字符

从我收集到的信息来看,以下两者之间的区别是什么?它们做的是相同的事情

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

第二个示例是否自动实例化对象?

否,第二个示例正在调用静态方法

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

非静态:

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

$foo = new foo();
$foo->bar();
静态:

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

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

有关更多信息,请参见此问题:


为了更好地理解这个概念,您应该检查它们与非静态的区别。

第二个示例不会自动实例化对象。因此,在第二种调用方式中,如果在函数中使用了$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总是以渐进的方式实现新功能,以确保兼容性,这可能导致一些细节不太在意。 但是,如果将错误报告级别设置为E_STRICT,则会发现这样的E_STRICT错误:
严格标准:不应静态调用非静态方法A::instanceFunc()

这两种方法的唯一区别是:当您使用以下命令调用方法时,不能使用变量$this。

但仍然建议您像在其他面向对象语言中一样严格使用这两种方法。

您可以在

中获得更多信息,这已被讨论了一百万次。你的PHP书在哪里?可能是重复的,这对我来说真的很清楚,老实说,我不知道他们有不同的名字。非常感谢。