Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 非静态调用静态方法_Php_Oop_Static Methods - Fatal编程技术网

Php 非静态调用静态方法

Php 非静态调用静态方法,php,oop,static-methods,Php,Oop,Static Methods,我有一个子类,它只使用静态方法扩展一个类。我想让这个子类成为一个单例而不是静态的,因为最初的开发人员确实想要一个单例,但是使用了静态的(很明显,因为静态类中的每个方法都调用Init()函数(基本上是一个构造函数)) 父级中的大多数方法不需要在子级中被覆盖,但我希望避免编写这样的方法: public function Load($id) { return parent::Load($id); } 如果我不想覆盖该方法,只想使用: $child->Load($id); 可以非静态

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

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

public function Load($id)
{
     return parent::Load($id);
}
如果我不想覆盖该方法,只想使用:

$child->Load($id);
可以非静态地调用静态方法吗?可以用实例对象扩展静态对象吗?我知道我可以尝试一下,而且很可能会成功(PHP非常宽容),但我不知道是否有什么需要我关心的。

  • 你能继承静态方法吗

  • 你能覆盖静态方法吗
是的,但只有在PHP5.3中,它们才能像您期望的那样工作:(即,
self
绑定到实际类,而不是它在其中定义的类)

  • 可以非静态地调用静态方法吗
是的,但将丢失
$this
。你还没有得到警告,但也没有理由说它是错误的。

答案由两部分组成

首先,关于名义上的问题:非静态地调用静态方法是非常好的@萨姆达克的评论是正确的。它不会发出警告,也不会导致任何小猫谋杀。试试看:

<?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();

为什么不使用普通的老PHP对象呢?没有头痛与所有的静态和单一的废话,你可能。另外,它是可测试的。毕竟,它是面向对象的,而不是面向类的。Singleton是一种设计模式。它使用一个“普通的旧”php对象,这意味着它有一个私有构造函数和一个静态GetInstance方法。它保证一个对象只存在一个实例,但因为它有一个构造函数,所以不必在每个方法中初始化变量。我知道什么是单例:)我想说的是:你不需要它。请参阅我最初评论中的链接。你的静态和单例让你的生活很痛苦。所以你建议使用第一种方法,我覆盖并调用父静态?如果你使用PHP5.3或更高版本,是的。此外,它是覆盖*而不是覆盖。您不会得到任何警告。警告只有在静态调用非静态方法时才会出现。现在我要哭了,因为上帝一定在我们的项目中杀了很多小猫:(没有小猫因此而死亡,相反,这是完全错误的!