PHP静态与对象调用

时间:2016-01-21 16:34:57

标签: php

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

PHP版本:5.6.12 XAMPP版本: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

2 个答案:

答案 0 :(得分:1)

这可以帮到你:

&#34;将类属性或方法声明为静态使它们可以访问而无需实例化类。声明为static的属性无法使用实例化的类对象访问(虽然静态方法可以)&#34;通过php.net

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

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

警告:在PHP 7中,不推荐静态调用非静态方法,并将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。 &#34;通过php.net

你的代码会起作用,但有警告,它取决于php版本。

有关详情,请参阅:http://php.net/manual/en/language.oop5.static.php

答案 1 :(得分:0)

如果你把:

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允许它,并不意味着任何不喜欢认可不良编程习惯的人应该以这种方式编程。