在一个非常简单的hello world PHP程序中使用静态方法的麻烦

时间:2010-02-26 01:44:30

标签: php zend-framework static

我正在通过阅读本教程来学习:Link 这是代码:

<?php

require_once 'Zend/Loader.php';

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    public static $root = '';
    public static $frontController = null;

    public static function run(){
        self::setupEnvironment();
        self::prepare();
        $response = self::$frontController->dispatch();
        self::sendResponse($response);
    }

    public static function setupEnvironment(){
        error_reporting(E_ALL|E_STRICT);
        ini_set('display_startup_errors',true);
        ini_set('display_errors',true);
        date_default_timezone_set('Europe/London');
        self::$root = realpath('..');
        define('APP_ROOT', self::$root);
        spl_autoload_register(array(__CLASS__,'autoload'));

    }
}

?>

我收到了这个错误:

  

致命错误:无法在第6行的C:\ XAMPP \ xampp \ htdocs \ HelloWorld \ application \ Bootstrap.php类Bootstrap中创建非静态方法Zend_Application_Bootstrap_Bootstrap :: run()static

我做错了什么?

3 个答案:

答案 0 :(得分:3)

如果仔细观察,错误说明了一切:

无法制作非静态方法Zend_Application_Bootstrap_Bootstrap :: run()static

因此从run方法def。

中删除static修饰符

答案 1 :(得分:2)

尝试将public static function run(){更改为public function run(){

答案 2 :(得分:0)

只有在

时才能静态调用方法
  1. 它被定义为静态,
  2. 它没有引用任何非静态声明
  3. 这是因为静态函数在没有任何上下文的情况下运行,这使得它们(略微)比标准方法更快,但有一些约束。见PHP Manual for Static keyword

    在代码中,类Bootstrap将run()声明为static,但它从父类Zend_Application_Bootstrap_Bootstrap重载方法run()。

    如果查看父类的代码,那么它的函数run()不会被声明为静态。由于重载方法必须与其父方法的声明匹配,这意味着您不能将BootStrap :: run()声明(或调用)为静态。

    解决方案是修改代码以删除静态声明。

    public function run(){
        self::setupEnvironment();
        self::prepare();
        $response = self::$frontController->dispatch();
        self::sendResponse($response);
    }
    

    我不使用Zend,因此不确定您是否会因此遇到更多与静态相关的错误。从根本上说,检查你的代码与教程,如果匹配,那么按照另一个教程;那一定是错的。