【问题标题】:different between static:: and $this-> and which syntax i should use?static:: 和 $this-> 之间的区别以及我应该使用哪种语法?
【发布时间】:2016-06-17 10:50:22
【问题描述】:

我有一些代码:

class a {
    public static function getCl() {
        echo __CLASS__;
    }
    public function test() {
        static::getCl();
    }
}
class b extends a {
    public static function getCl() {
        echo __CLASS__;
    }
}
$testClass = new b();
$testClass->test();

这个结果:b。然后我试试这个:

class a {
    public static function getCl() {
        echo __CLASS__;
    }
    public function test() {
        $this->getCl();
    }
}
class b extends a {
    public static function getCl() {
        echo __CLASS__;
    }
}
$testClass = new b();
$testClass->test();

这个结果仍然是 b。我已经知道 static:: 和 self:: 之间的区别,但是有人可以告诉我我的代码中 static:: 和 $this-> 之间的区别。我应该使用哪一个?

【问题讨论】:

  • 在您的上下文中,主要区别在于使用 $this 您可以创建对象链接,但使用 static 关键字是不可能的。
  • static:: 只能用于静态方法/属性,而$this-> 可以用于任何一个。
  • @silkfire:根据手册,声明为静态的属性不能被实例化的类对象访问

标签: php static this


【解决方案1】:

您的上下文将产生相同的结果。

这里是对两者的简单描述。

静态:- 引用late static binding 从 PHP 5.3.0 开始,PHP 实现了一个称为后期静态绑定的功能,可用于在静态继承的上下文中引用被调用的类。

对当前类的静态引用,如 self:: 或 CLASS 使用函数所属的类解析,如定义它的位置:

虽然后期静态绑定试图通过引入引用最初在运行时调用的类的关键字来解决该限制。基本上,一个允许您从父类方法引用子类的关键字。决定不引入新关键字,而是使用已经保留的 static。

$this:- 引用当前对象。

一旦进入一个对象的函数,您就可以完全访问它的变量,但要设置它们,您需要更具体,而不仅仅是使用您想要使用的变量名称。要正确指定要使用局部变量,您需要使用特殊的 $this 变量,PHP 始终将其设置为指向您当前正在使用的对象。

【讨论】:

  • 并非如此。鉴于这两种方法产生相同的结果(没有任何警告/通知),偏爱其中一种方法的原因是什么?您可以展示(至少)两件事:a)$this->self:: 相比产生不同/意外的结果;我想知道你是否可以在 php 中做到这一点(可能,但我不能)。 b) 对于阅读代码的开发人员来说,它变得非常非常混乱。例如。在 Java 中使用 object.staticMethod() 两者都是正确的(这就是编译器生成警告的原因;但只是一个警告;也值得探索)。
  • @VolkerK:完全同意你的看法。现有的上下文产生相同的结果。据我所知,主要区别在于我们可以使用 $this 创建对象链接,但不能使用 static 关键字。
猜你喜欢
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2019-11-07
  • 2013-10-23
  • 1970-01-01
  • 2018-11-02
  • 2016-06-17
  • 2012-08-18
相关资源
最近更新 更多