我有一个子类,它只用静态方法扩展类。我想让这个子类成为单例类而不是静态类,因为最初的开发人员确实想要一个单例类,但使用的是静态类(很明显,因为静态类中的每个方法都调用Init()函数(基本上是一个构造函数))。
父级中的大多数方法不需要在子级中被重写,但我希望避免编写这样的方法:
public function Load($id)
{
return parent::Load($id);
}当我不想重写这个方法时,只需要使用:
$child->Load($id);是否可以非静态地调用静态方法?可以用实例对象扩展静态对象吗?我知道我可以尝试它,它可能会工作(PHP是非常宽宏大量的),但我不知道是否有什么我应该关注的。
发布于 2013-03-30 00:20:14
是
是的,但只有在PHP5.3中,它们才能像你预期的那样工作:http://www.php.net/manual/en/language.oop5.static.php (即.self绑定到实际的类,而不是定义它的类)。
可以调用静态方法non-statically?吗?
是的,但是会失去$this。你还没有得到警告,但也没有理由以错误的方式调用它。
发布于 2015-09-24 02:29:37
答案分为两部分。
首先,关于标题问题:以非静态方式调用静态方法是非常好的;@SamDark的评论是正确的。它不会产生警告,也不会导致任何小猫被谋杀。试试看:
<?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。
https://stackoverflow.com/questions/15707029
复制相似问题