无法制作非静态方法 - 致命错误

时间:2015-05-05 05:03:49

标签: php

我正在开发一个PHP Web应用程序。我使用了来自gurrido.net的新数据网格,它在本地运行良好但是当我将其上传到服务器时,我收到以下错误:

  

致命错误:无法使非静态方法Base :: getClassName()静态   在/var/www/reskb/phpinc/Singletons.class.php上的单身人士课堂上   第84行

在我没有使用网格的旧版本中,我得到了它的工作。这是我的singletons.class.php文件代码:

<?
class Singletons extends Base {
    var $objects = array();
    function getClassName() {
        return 'Singletons';
    }
    function _instance() {
        static $_instance = NULL;
        if ($_instance == NULL) {
            $className = Singletons::getClassName();
            $_instance = new $className();
        }
        return $_instance;
    }
    function put($object) {
        $self = Singletons::_instance();
        $className = $object->getClassName();
        $self->objects[$className] = $object;
    }
    function get($className) {
        $self = Singletons::_instance();
        if(!empty($self->objects[$className]))
            return $self->objects[$className];
        else return '';
    }
}
Singletons::_instance();
?>

3 个答案:

答案 0 :(得分:2)

您应该使用object调用函数getClassName或将getClassName定义为static。 -

  <?php
    class Singletons extends Base {
        var $objects = array();
        static function  getClassName() {
            return 'Singletons';
        }
        static function _instance() {
            static $_instance = NULL;
            if ($_instance == NULL) {
                $className = Singletons::getClassName();
                $_instance = new $className();
            }
            return $_instance;
        }
        function put($object) {
            $self = Singletons::_instance();
            $className = $object->getClassName();
            $self->objects[$className] = $object;
        }
        function get($className) {
            $self = Singletons::_instance();
            if(!empty($self->objects[$className]))
                return $self->objects[$className];
            else return '';
        }
    }
    Singletons::_instance();
    ?>

答案 1 :(得分:0)

您收到错误是因为当它不是静态方法( function )时,您试图静态调用函数。

您需要将该函数指定为static:

static function getClassName() {
    return 'Singletons';
}

这适用于您希望静态调用的每种方法。

答案 2 :(得分:0)

如果在抽象超类中将函数声明为抽象,然后尝试在子类中将其定义为静态,则会出现致命错误。您可能要考虑类层次结构的构造方式,因为唯一的选择就是从超类中删除抽象函数声明。