PHP 静态调用与对象调用


PHP static vs. object calls

所以我有这个问题,我可以静态调用对象方法,反之亦然。这是应该发生的还是万一我做错了什么?

PHP 版本: 5.6.12XAMPP版本:3.2.1

function endl()
{
    echo "<br>";
}
class Base
{
    public function objectFunc($msg)
    {
        echo "You called a non-static function from " . $msg;
        endl();
    }
    public static function staticFunc($msg)
    {
        echo "You called a static function from " . $msg;
        endl();
        }
    }
Base::objectFunc("a static call");
Base::staticFunc("a static call");
$base = new Base;
$base->objectFunc("a non-static call");
$base->staticFunc("a non-static call");

Here are the results from running this:
You called a non-static function from a static call
You called a static function from a static call
You called a non-static function from a non-static call
You called a static function from a non-static call

这可以帮助您:

"将类属性或方法声明为静态可以使它们无需实例化即可访问。声明为静态的属性不能使用实例化的类对象访问(尽管静态方法可以)"php.net

"因为静态方法在没有创建对象的实例的情况下是可调用的,所以伪变量$this在声明为静态的方法中不可用。

注意: 在 PHP 5 中,静态调用非静态方法会生成E_STRICT级别警告。

警告:在 PHP 7 中,不推荐使用静态调用非静态方法,并且会生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。"由 php.net

您的代码将正常工作,但有警告,这取决于 php 版本。

有关更多信息,请参阅:http://php.net/manual/en/language.oop5.static.php

如果你把:

error_reporting(E_ALL);
ini_set('display_errors', '1');

在 PHP 7.0 中,您将看到以下消息:已弃用:非静态方法 Base::objectFunc() 不应在 ...

但请注意,这不是错误,而是"已弃用"的警告。也没有出现错误或警告:

$base->staticFunc("a non-static call");

这是 PHP 中的一个古老的已知问题。(这与 PHP 在 PHP 4 中的情况有关,迁移到 PHP 5 决定具有向后兼容性)

可能是因为这种行为已经存在了很多年,即使在 PHP 7 中也没有改变,所以它是不合理的,并且允许非常糟糕的编程习惯。你是对的,它有一些可怕的错误。PHP允许它,并不意味着任何不喜欢认可不良编程习惯的人都应该这样编程。