【问题标题】:Accessing static methods using newly created $obj or using class Name使用新创建的 $obj 或使用类名访问静态方法
【发布时间】:2013-10-08 05:05:31
【问题描述】:

请看下面的类定义:
我目前使用的是5.3.9版本的PHP

class A{
    static function ab(){
        echo "static function ab<br>";
    }

    public function xy(){
        echo "public function xy<br>";
    }
}

$obj =  new A();
$obj->ab();
A::ab();

两个函数调用都给出相同的输出,没有任何错误

static function ab
static function ab

static method 怎么可能也被类对象调用? 因为static method 只使用class name only?! 调用

现在访问这两种方式调用static method有什么区别?

【问题讨论】:

    标签: php oop static-methods


    【解决方案1】:

    参考php.net网站

    将类属性或方法声明为静态使它们无需实例化即可访问。声明为静态的属性不能被实例化的类对象访问(尽管静态方法可以)。

    一个很大的区别是

    因为静态方法可以在没有创建对象实例的情况下调用,所以伪变量 $this 在声明为静态的方法中不可用。

    更多详情请参考页面php.net/manual/en/language.oop5.static.php

    【讨论】:

      【解决方案2】:

      只要你只是回显一个简单的字符串,没有区别,如果你的方法将被声明为静态或公共,因为静态方法也可以与对象实例一起调用。从 PHP 5.5 开始,如果您以静态方式调用公共方法,则会引发错误。但是,可以使用classname::staticMethod() 调用静态方法,因此页面应该只知道该类,而不需要它的实例。

      另一个处理是方法内容。正如我所说,如果你只是回显一个字符串,你不需要一个静态方法。静态方法不在对象上下文中。这意味着你不能通过 $this 访问当前对象的属性或方法

      【讨论】:

      • 我从 static method 中删除了 public 关键字。它仍然给出相同的结果。
      • 你期待什么不同的结果?尝试在您的静态方法中调用$this-&gt;xy()
      • 是的。我知道它会产生错误。但我担心的是calling static method 使用instance of class
      • 通过类的实例调用静态方法没有问题。关键是你不需要它。你甚至不需要这个类的实例。官方文档说你可以通过类的实例访问静态方法,但是你不能以同样的方式访问静态属性
      • 好的。所以静态属性不能通过类的实例访问,但可以访问静态方法。
      猜你喜欢
      • 1970-01-01
      • 2011-06-30
      • 2011-08-03
      • 2015-06-26
      • 2017-11-01
      • 2011-06-30
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多