parent::init();//调用父类的构造函数试试
$user = new tb_user();  

解决方案 »

  1.   

    谢谢,正常了,可是还是有些疑问
    必须显式调用父类构造函数才可以吗?
    我是跟着视频教程里敲的代码,视频里没有显式调用父类构造函数也可以正常运行啊。。
    难道是php版本的问题?
    我的php版本是5.4.16
      

  2.   

    当然不是!是你理解的有问题
    init 方法不是构造函数,但是会在 Zend_Controller_Action 的构造函数中调用,目的在于可以让用户干预一下默认的行为
    你的 IndexController::init 方法覆盖了 BaseController::init 方法
    于是 BaseController::init 中的初始化代码未能执行,所以出错
      

  3.   

    PHP新版本中子类不主动调用父类构造函数。并且这个在新版本中不是构造函数
      

  4.   

    对于他的版本应该是这样的。但是他学的视频会不会是PHP4的,那个时候构造函数名称可以自己定的,不一定是__construct
      

  5.   

    是吗?
    构造函数 __construct 的确是 php5 才有的
    但 php4 和 php5 都支持用与类名相同的方法作为构造函数
    所以在这里无论如何都不能把 init 当做构造函数
    对于他的版本应该是这样的。但是他学的视频会不会是PHP4的,那个时候构造函数名称可以自己定的,不一定是__construct
      

  6.   

    我知道php中构造函数是__constructor() ,init()并不是构造函数,但在初始化时调用我看的视频里也用__construtor做构造函数的。我自己试了一下,把数据库初始化的代码写到 BaseController的__constructor()构造函数中,结果日志报错[28-Mar-2014 10:00:06 Asia/Shanghai] PHP Fatal error:  Declaration of BaseController::__construct() must be compatible with Zend_Controller_Action_Interface::__construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = Array) in E:\phpdoc\zend\promvc\application\controllers\BaseController.php on line 27[28-Mar-2014 10:00:06 Asia/Shanghai] PHP Stack trace:[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   1. {main}() E:\phpdoc\zend\promvc\public\index.php:0[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   2. Zend_Application->run() E:\phpdoc\zend\promvc\public\index.php:26[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   3. Zend_Application_Bootstrap_Bootstrap->run() E:\phpdoc\zend\promvc\library\Zend\Application.php:366[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   4. Zend_Controller_Front->dispatch($request = *uninitialized*, $response = *uninitialized*) E:\phpdoc\zend\promvc\library\Zend\Application\Bootstrap\Bootstrap.php:101[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   5. Zend_Controller_Dispatcher_Standard->dispatch($request = class Zend_Controller_Request_Http { protected $_paramSources = array (0 => '_GET', 1 => '_POST'); protected $_requestUri = '/'; protected $_baseUrl = ''; protected $_basePath = NULL; protected $_pathInfo = '/'; protected $_params = array ('controller' => 'index', 'action' => 'index', 'module' => 'default'); protected $_rawBody = NULL; protected $_aliases = array (); protected $_dispatched = TRUE; protected $_module = 'default'; protected $_moduleKey = 'module'; protected $_controller = 'index'; protected $_controllerKey = 'controller'; protected $_action = 'index'; protected $_actionKey = 'action' }, $response = class Zend_Controller_Response_Http { protected $_body = array (); protected $_exceptions = array (); protected $_headers = array (); protected $_headersRaw = array (); protected $_httpResponseCode = 200; protected $_isRedirect = FALSE; protected $_renderExceptions = FALSE; public $headersSentThrowsException = TRUE }) E:\phpdoc\zend\promvc\library\Zend\Controller\Front.php:954[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   6. Zend_Controller_Dispatcher_Standard->loadClass($className = 'IndexController') E:\phpdoc\zend\promvc\library\Zend\Controller\Dispatcher\Standard.php:275[28-Mar-2014 10:00:06 Asia/Shanghai] PHP   7. include_once() E:\phpdoc\zend\promvc\library\Zend\Controller\Dispatcher\Standard.php:357
      

  7.   

    把数据库初始化的代码写到 BaseController的__constructor()
    那就覆盖了 Zend_Controller_Action::__constructor 当然是要出错的
    php 中,如果子类有构造函数,则不执行父类的构造函数
    要向执行的话,需要有 parent::__construct();
      

  8.   

    话说 Zend Framework 中,表属于 Mode 
    你为什么不按他的套路来呢?