首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP静态调用与对象调用

PHP静态调用与对象调用
EN

Stack Overflow用户
提问于 2016-01-21 16:34:56
回答 2查看 63关注 0票数 1

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

PHP版本: 5.6.12 XAMPP版本: 3.2.1

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-21 16:56:45

这能帮到你:

“将类属性或方法声明为静态使它们可以访问,而不需要类的实例化。声明为静态的属性不能使用实例化的类对象(,虽然静态方法可以)来访问。”

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

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

警告:在PHP7中,静态调用非静态方法是不可取的,并将生成E_DEPRECATED警告。对静态调用非静态方法的支持在将来可能会被删除。“由php.net

您的代码会正常工作,但是对于警告,它取决于php版本。

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

票数 1
EN

Stack Overflow用户

发布于 2016-01-21 19:27:31

如果你说:

代码语言:javascript
复制
error_reporting(E_ALL);
ini_set('display_errors', '1');

在PHP7.0中,您将得到以下消息:de推荐:非静态方法库::objectFunc()不应在.

但请注意,这不是一个错误,而是一个“不推荐”的警告。此外,也没有错误或警告来自:

代码语言:javascript
复制
$base->staticFunc("a non-static call");

这是PHP中一个已知的老问题。(它必须做的是PHP在PHP 4中的应用,然后迁移到PHP 5,决定向后兼容)

也许是因为这种行为已经存在很多年了,它甚至在PHP 7中都没有被改变过,这是不合理的,并且允许非常坏的编程习惯。你是对的PHP允许这样做,并不意味着任何不喜欢认可不良编程习惯的人都应该以这种方式编程。

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

https://stackoverflow.com/questions/34929264

复制
相关文章

相似问题

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