【问题标题】:How does the non-static method of a class is getting called statically from another different class' method without creating the object of former?一个类的非静态方法如何从另一个不同类的方法静态调用而不创建前者的对象?
【发布时间】:2017-11-16 14:15:50
【问题描述】:

我正在使用 PHP 7.1.11

考虑下面的代码:

<?php
  class A {
    function foo() {
      if (isset($this)) {
        echo '$this is defined (';
        echo get_class($this);
        echo ")\n";
      } else {
        echo "\$this is not defined.\n";
      }
    }
  }

  class B {
    function bar() {
      A::foo();
    }
  }

  $a = new A();
  $a->foo();

  A::foo();
  $b = new B();
  $b->bar();

  B::bar();
?>

以上代码的输出:

$this is defined (A)
$this is not defined.
$this is not defined.
$this is not defined.

除了输出中的第一行之外,接下来的三行输出是通过静态调用class A 中存在的非静态方法foo() 生成的(即没有创建class A 的对象)。

有人请解释一下这是怎么回事?

如何从正在考虑的类的类/对象静态调用另一个类的非静态方法(即class B 这里)?

谢谢。

【问题讨论】:

  • 启用错误报告
  • @PeeHaa :如何启用它?我的意思是它的代码是什么?应该在哪里添加对应的代码?
  • 在代码顶部使用ini_set("display_errors",1);来启用错误
  • ini_set("display_errors",1); 也尝试过使用PHP 7.1.1 的代码,一切正常。很奇怪。

标签: php class object non-static


【解决方案1】:

注意:PHP 在静态与非静态方法方面非常松散

但是:不应该静态调用非静态方法(即使 PHP 可以容忍)。为什么?

如果一个方法不是静态的,这通常意味着它依赖于实例的状态,因为否则它可以设为静态

有时非静态方法不依赖于实例,因此程序仍然可以工作,因为该方法可能是静态的。 但你永远不应该这样做

此外 - 如果您打开错误报告,PHP 也会告诉您:

$this 已定义 (A)
已弃用:非静态方法 A::foo() 不应该在 [...][...] 在线静态调用 25
$this 未定义。
已弃用: 非静态方法 A::foo() 不应在 [...][...]18
$this 未定义。
已弃用:不应调用非静态方法 B::bar() 静态地在 [...][...]29

已弃用:非静态方法 A: :foo() 不应该被调用 静态地在 [...][...]18
$this is not 已定义。

Deprecated 也意味着:仅仅因为 PHP 仍然允许这样做,它很可能会在未来的 PHP 更新中被删除。

【讨论】:

    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多