php - 为什么 PHP 在对象上下文中使用静态方法?

标签 php static-methods magic-methods

我有以下代码(实际上,这是我的真实代码):

<?php
class Foobar
{
  public static function foo()
  {
    exit('foo');
  }
}

当我运行 $foobar = new FooBar; $foobar->foo() 它显示 foo

为什么 PHP 会尝试在对象上下文中使用静态方法?有没有办法避免这种情况?


好的,你们没听懂我的问题:我知道静态和非静态方法之间的区别以及如何调用它们。这就是我的全部观点,如果我调用 $foobar->foo(),为什么 PHP 会尝试运行静态方法?


注意:我运行 PHP 5.4.4,向 E_ALL 报告错误。

最佳答案

要调用静态方法,您不要使用:

$foobar = new FooBar;
$foobar->foo()

你打电话

FooBar::foo();

PHP 手册说...

Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static can not be accessed with an instantiated class object (though a static method can).

这就是为什么您能够在实例上调用该方法,即使那不是您打算做的。

无论您是静态调用还是在实例上调用静态方法,都不能在静态方法中访问$this

http://php.net/manual/en/language.oop5.static.php

您可以检查您是否处于静态上下文中,尽管我会质疑这是否有点矫枉过正...

class Foobar
{
  public static function foo()
  {
    $backtrace = debug_backtrace();
    if ($backtrace[1]['type'] == '::') {
      exit('foo');
    }
  }
}

另外一个注意事项 - 我相信该方法总是在静态上下文中执行,即使它是在实例上调用的。如果我错了,我很高兴得到纠正。

关于php - 为什么 PHP 在对象上下文中使用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382206/

相关文章:

php - 选择一个随机行,其中一个字段不等于并且另一个字段不在另一个表中

php - JS 代码中出现 smarty 错误

python - 使用静态方法而不是函数中的子函数的必要性

python - 分配(而不是定义) __getitem__ 魔术方法会破坏索引

PHP 5.3 魔术方法 __invoke

php - 找出博客正在使用的 WordPress 版本(从外部)

php - mysql使用多个OR语句进行查询

c# - C# 中静态构造函数不能有返回类型,但静态方法必须有返回类型

PHP 静态方法初始化 $_SESSION 变量?

ruby - Ruby 中的魔术方法?