【问题标题】:The good way to call a private static method? [duplicate]调用私有静态方法的好方法? [复制]
【发布时间】:2013-09-25 14:43:33
【问题描述】:

这个问题可能看起来很愚蠢,但($this 和 self)都可以调用静态方法。

但是,正确的方法是什么?

我个人倾向于使用“self”,因为私有静态方法就像一个不使用任何对象状态的实用函数。

$data = self::calcSoldeNextMonths('sl', $data, $toSub);
$data = $this->calcSoldeNextMonths('sl', $data, $toSub);

【问题讨论】:

  • stackoverflow.com/questions/151969/when-to-use-self-vs-this。所以 self 用于静态,this 用于非静态
  • 声明私有静态方法有意义吗?我总是使用公共静态方法:)
  • 所有静态方法都应该用staticself调用
  • @Adam 是的,在 publicprotected 上使用 private 是有意义的
  • @Glavić 什么都没发生。

标签: php oop


【解决方案1】:

我个人更喜欢self::,因为它立即告诉我我正在处理一个静态方法。挖掘代码肯定不会很有趣,因为我必须不断查找函数声明才能确定该方法在什么上下文中运行。

编辑 请在第一条评论中查看@Kakawait 的链接:When to use self vs this。使用self(即范围解析)查看第二个最受好评的答案。

【讨论】:

  • 我只是觉得奇怪的是,使用 $this 调用静态方法时没有显示错误/通知。
  • 好吧,又是一个 PHP 怪癖,用来招惹那些好人。
【解决方案2】:

静态方法只能用 static::self::

调用

self:: 表示类,this-> 表示当前对象。根据定义,静态方法是独立于对象的类方法,我更喜欢使用 self::

【讨论】:

  • 不完全是,PHP 5.3 及更高版本还需要考虑 static:: 关键字。
  • @aefxx static 用于后期静态绑定,可用于在静态继承上下文中引用被调用类,请参考php.net/manual/en/language.oop5.late-static-bindings.php
  • @Shushant 响应者编辑了他的答案。他首先声明:“[...]唯一正确的方法是self::”。正如我刚刚指出的那样,这并不完全正确。
【解决方案3】:

这是区分selfstatic 的简单示例,以及记住两者不同黑白的简单方法

self 返回基础对象的基础实例(self 被调用的地方)

static 返回对象的当前实例(任一对象都已扩展)。

class BaseClass {

public function make()
{
    echo __METHOD__, "\n";
}

public function println()
{
    static::make();
}
}

class BaseClass2{

public function make()
{
    echo __METHOD__, "\n";
}

public function println()
{
    self::make();
}
}

class StaticClass extends BaseClass{

public function make()
{
    echo __METHOD__;
}
}

 class selfMain extends BaseClass2{
public function make()
{
    echo __METHOD__;
}
 }
$obj = new StaticClass();
$obj->println();//return the current instance of object

$obj = new selfMain();
$obj->println();//return the best instance of object

【讨论】:

  • 感谢您的详细回答,但我知道$thisself 之间的区别。这不是问题。
猜你喜欢
  • 2019-03-27
  • 2019-07-26
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2017-10-08
  • 1970-01-01
  • 2013-11-12
相关资源
最近更新 更多