Table des matières
回复讨论(解决方案)
Maison développement back-end tutoriel php 数据库初始化父类继承的问题

数据库初始化父类继承的问题

Jun 23, 2016 pm 02:00 PM

小弟刚开始学ZendFramework框架,有个问题想请教各位大神

数据库初始化代码,我原先写在Bootstrap类中,是没有问题的。
写在控制器的init()方法里也可以。
但是我想抽象出一个类,并继承这个类,就是不行
总是报错 An error occurred     Application error,错误日志也没有东西
我觉得应该是没有调用父类的init()方法导致没有初始化数据库造成的
但是应该怎么修改代码呢,求指教

下面是我的代码

1 父类 BaseController 

class BaseController  extends Zend_Controller_Action{		public function init()	{		//初始化数据库适配器 		$url = constant("APPLICATION_PATH").DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'application.ini'; 		$dbconfig = new Zend_Config_Ini($url,'mysql'); 		$db = Zend_Db::factory($dbconfig->db); 		$db->query('SET NAMES UTF8'); 		Zend_Db_Table::setDefaultAdapter($db); 		//echo "<pre class="brush:php;toolbar:false">"; 通过访问base控制器测试这里是有值的 		//print_r($db); 		//exit();	}		public function indexAction()	{	}}
Copier après la connexion


2 IndexController
require_once   APPLICATION_PATH. '/models/tb_user.php';require_once  'BaseController.php';//有对数据库进行操作的控制器继承BaseController,没有对数据库进行操作的控制器继承Zend_Controller_Actionclass IndexController extends BaseController{    public function init()    {    	    	//把下面的注释就没有问题,放开第一句的注释就会报错An error occurred    Application error     	$user = new tb_user();          $res = $user->fetchAll()->toArray();   //查询数据表tb_user中的数据        $this->view->res = $res;  //将获得的数据分配给View        $this->render('index');    }    public function indexAction()    {        // action body    }
Copier après la connexion


回复讨论(解决方案)

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

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

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

以前学过点 C#,在C#里继承是默认会先调用父类的构造函数,再调用子类构造函数的。

谢谢,原来是版本问题。

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

以前学过点 C#,在C#里继承是默认会先调用父类的构造函数,再调用子类构造函数的。
PHP新版本中子类不主动调用父类构造函数。并且这个在新版本中不是构造函数

当然不是!是你理解的有问题
init 方法不是构造函数,但是会在 Zend_Controller_Action 的构造函数中调用,目的在于可以让用户干预一下默认的行为
你的 IndexController::init 方法覆盖了 BaseController::init 方法
于是 BaseController::init 中的初始化代码未能执行,所以出错
对于他的版本应该是这样的。但是他学的视频会不会是PHP4的,那个时候构造函数名称可以自己定的,不一定是__construct

是吗?
构造函数 __construct 的确是 php5 才有的
但 php4 和 php5 都支持用与类名相同的方法作为构造函数
所以在这里无论如何都不能把 init 当做构造函数



当然不是!是你理解的有问题
init 方法不是构造函数,但是会在 Zend_Controller_Action 的构造函数中调用,目的在于可以让用户干预一下默认的行为
你的 IndexController::init 方法覆盖了 BaseController::init 方法
于是 BaseController::init 中的初始化代码未能执行,所以出错
对于他的版本应该是这样的。但是他学的视频会不会是PHP4的,那个时候构造函数名称可以自己定的,不一定是__construct

我知道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

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

Expliquez le concept de liaison statique tardive en PHP. Expliquez le concept de liaison statique tardive en PHP. Mar 21, 2025 pm 01:33 PM

L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Mar 28, 2025 pm 05:11 PM

L'article traite des fonctionnalités de sécurité essentielles dans les cadres pour se protéger contre les vulnérabilités, notamment la validation des entrées, l'authentification et les mises à jour régulières.

Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Frameworks de personnalisation / d'extension: comment ajouter des fonctionnalités personnalisées. Mar 28, 2025 pm 05:12 PM

L'article examine l'ajout de fonctionnalités personnalisées aux cadres, en se concentrant sur la compréhension de l'architecture, l'identification des points d'extension et les meilleures pratiques pour l'intégration et le débogage.

See all articles