首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非静态调用静态方法

问非静态调用静态方法
EN

Stack Overflow用户
提问于 2013-03-30 00:12:58
回答 2查看 6.1K关注 0票数 7

我有一个子类,它只用静态方法扩展类。我想让这个子类成为单例类而不是静态类,因为最初的开发人员确实想要一个单例类,但使用的是静态类(很明显,因为静态类中的每个方法都调用Init()函数(基本上是一个构造函数))。

父级中的大多数方法不需要在子级中被重写,但我希望避免编写这样的方法:

代码语言:javascript
复制
public function Load($id)
{
     return parent::Load($id);
}

当我不想重写这个方法时,只需要使用:

代码语言:javascript
复制
$child->Load($id);

是否可以非静态地调用静态方法?可以用实例对象扩展静态对象吗?我知道我可以尝试它,它可能会工作(PHP是非常宽宏大量的),但我不知道是否有什么我应该关注的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-30 00:20:14

  • 您是否可以继承静态方法?

是

  • 您能否重写静态方法?

是的,但只有在PHP5.3中,它们才能像你预期的那样工作:http://www.php.net/manual/en/language.oop5.static.php (即.self绑定到实际的类,而不是定义它的类)。

可以调用静态方法non-statically?吗?

是的,但是会失去$this。你还没有得到警告,但也没有理由以错误的方式调用它。

票数 11
EN

Stack Overflow用户

发布于 2015-09-24 02:29:37

答案分为两部分。

首先,关于标题问题:以非静态方式调用静态方法是非常好的;@SamDark的评论是正确的。它不会产生警告,也不会导致任何小猫被谋杀。试试看:

代码语言:javascript
复制
<?php

class test {
    public static function staticwarnings(){
        echo "YOU ARE (statically) WARNED!\n";
    }
}

error_reporting(E_ALL);

$test = new test();
echo "\n\ncalling static non-statically\n";
$test->staticwarnings();

如果在静态方法中有一个实例引用$this,那么您将得到一个致命错误。但不管你怎么称呼它,这都是真的。

再说一次,没有任何警告,也没有任何小猫被杀死。

答案的第二部分:

从重写子类调用重写的父函数需要名为""的代码。OP在他们的方法中所做的不是调用静态方法。(或者至少,它不是必须的;我们看不到父实现)。关键是,使用parent关键字不是静态调用。在显式父类名称上使用::运算符也不是静态调用,如果它是从扩展类中使用的。

为什么该文档链接的名称如此奇怪?字面意思是希伯来语。如果您曾经遇到过与之相关的错误,那么您可能会注意到名称令人愉快的解析器错误代码T_PAAMAYIM_NEKUDOTAYIM。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15707029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档