【问题标题】:static function in PHPPHP中的静态函数
【发布时间】:2012-08-29 10:18:55
【问题描述】:

如果我使用范围解析运算符调用公共函数,它不会给出任何错误。

 class Parent_class
{

    public function st_function()
    {
        echo "*************parent class************\n";
    }
}
Parent_class:: st_function();

但在 php.net 上的 PHP 文档中,考虑到 - 静态调用非静态方法会生成 E_STRICT 级别的警告。还鉴于 - 无法使用箭头运算符通过对象访问静态属性 -> 但它没有给出任何错误。谁能解释一下?

class Parent_class
{

    public static function st_function()
    {
        echo "*************parent class************\n";
    }
}
Parent_class:: st_function();
$var = new Parent_class();
$var->st_function();

【问题讨论】:

  • 您是否使用严格的错误报告?
  • 是的,对..当我添加 error_reporting(E_STRICT) 时,它作为严格标准发出通知:非静态方法 Parent_class::st_function() 不应在 D:\wamp\www\ 中静态调用第 103 行的 test.php

标签: php


【解决方案1】:

不能通过对象访问静态属性,但不能通过静态方法访问。

来自doc

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

【讨论】:

    【解决方案2】:

    如果您激活严格的错误报告,您看到静态调用非静态方法的错误:

    error_reporting(E_ALL | E_STRICT);
    

    对于第二部分,您可以非静态地调用静态方法,因为手册中的段落讨论的是静态属性,而不是方法。你不能像Parent_class->static_property那样访问Parent_class::static_property,如果它有这样的属性的话。

    调用对象的静态方法可以正常工作,在这种情况下,$var-> 只是Parent_class:: 的便捷简写。

    【讨论】:

      【解决方案3】:

      在你的代码之前试试这个:

      error_reporting(E_ALL | E_STRICT);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-28
        • 2014-12-28
        • 2012-02-15
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 2012-04-21
        • 1970-01-01
        相关资源
        最近更新 更多