2012-06-20 57 views
0

我下面的Magento开发教程的Magento的开发商:第5部分 - Magento模型和ORM基础Magento的警告:get_class()预计参数1是对象,布尔给

当我尝试回声类名我得到以下错误。 PS:我使用的Magento 1.7

Warning: get_class() expects parameter 1 to be object, boolean given in C:\xampp\htdocs\magento\app\code\local\Microdatanet\Weblog\controllers\IndexController.php on line 19 

#0 [internal function]: mageCoreErrorHandler(2, 'get_class() exp...', 'C:\xampp\htdocs...', 19, Array) 
#1 C:\xampp\htdocs\magento\app\code\local\Microdatanet\Weblog\controllers\IndexController.php(19): get_class(false) 
#2 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Controller\Varien\Action.php(419): Microdatanet_Weblog_IndexController->testModelAction() 
#3 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Controller\Varien\Router\Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('testModel') 
#4 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Controller\Varien\Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http)) 
#5 C:\xampp\htdocs\magento\app\code\core\Mage\Core\Model\App.php(354): Mage_Core_Controller_Varien_Front->dispatch() 
#6 C:\xampp\htdocs\magento\app\Mage.php(683): Mage_Core_Model_App->run(Array) 
#7 C:\xampp\htdocs\magento\index.php(87): Mage::run('', 'store') 
#8 {main} 

FILE:应用程序\代码\本地\ Microdatanet \博客\控制器\ IndexController.php

<?php 
class Microdatanet_Weblog_IndexController extends Mage_Core_Controller_Front_Action { 
    public function testModelAction(){ 
     $blogpost = Mage::getModel('weblog/blogpost'); 
     echo get_class($blogpost); 
    } 
} 
?> 

FILE:应用程序\代码\本地\ Microdatanet \博客\等\ config.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <modules> 
     <Microdatanet_Weblog> 
      <version>0.1.0</version> 
     </Microdatanet_Weblog> 
    </modules> 

    <global> 
     <models> 
      <weblog> 
       <class>Microdatanet_Weblog_Model</class> 
       <resourceModel>weblog_mysql4</resourceModel> 
      </weblog> 
      <weblog_mysql4> 
       <class>Microdatanet_Weblog_Model_Mysql4</class> 
      </weblog_mysql4> 
     </models> 
    </global> 

    <frontend> 
     <routers> 
      <weblog> 
       <use>standard</use> 
       <args> 
        <module>Microdatanet_Weblog</module> 
        <frontName>weblog</frontName> 
       </args> 
      </weblog> 
     </routers> 
    </frontend> 
</config> 

FILE:应用程序\代码\本地\ Microdatanet \博客\型号\ Blogpost.php

<?php 
class Mircodatanet_Weblog_Model_Blogpost extends Mage_Core_Model_Abstract 
{ 
    protected function _construct() 
    { 
     $this->_init('weblog/blogpost'); 
    } 
} 
?> 

回答

3

当一个类不能通过Magento工厂方法实例化时,有很多方法可以进行调试。学习如何在Magento中进行鉴别诊断很重要,因为它大量使用配置和特定的约定。

$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local'; 
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community'; 
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core'; 
$paths[] = BP . DS . 'lib'; 

$appPath = implode(PS, $paths); 
set_include_path($appPath . PS . Mage::registry('original_include_path')); 
include_once "Mage/Core/functions.php"; 
include_once "Varien/Autoload.php"; 

Varien_Autoload::register(); 

一旦发生这种情况,所有的PHP:

在Magento所有的类定义(应该)通过自动加载磁带机(Varien_Autoload),这是在app/Mage.php调用,并且依赖于包括路径设置加载需要查找类定义的是,类名与文件相对于上面包含路径的路径相匹配。这种类型的自动加载方案在PHP项目中很流行。

这提出了第一个测试策略:直接调用该类。在控制器操作或测试文件中,执行以下操作:

$obj = new Microdatanet_Weblog_Model_Blogpost; 

如果PHP找不到类定义,则会引发致命错误。如果可以找到类定义,那很好,但有两件事情是正确的:考虑到类名传递给new,文件路径是正确的,并且Blogpost.php文件中的类名正确。

同样,这是PHP最近的典型自动加载方案。基于XML中的某些信息,Magento所做的是使用一些方法来创建类名。仅供参考,此工厂方法提供的方法只有两个有用的目的:允许运行时类别重写,并在注册表中注册单个实例。

假设可以像上面那样调用类,如果Mage::getModel('weblog/blogpost')没有返回类实例,则问题必须在配置中。发生这种情况通常有三个原因:模块配置未包含,模块配置格式错误,或者配置已解析,但其中的信息不可用。

那么,如何差分诊断类组配置问题呢?首先,确保首先包含和解析模块配置:通过不匹配标签或其他不可解析的语法来破坏XML。刷新或禁用配置缓存,系统应该抛出解析错误。如果没有,发生三件事情之一:模块在app/etc/modules/[declaration file].xml中未正确激活,模块的config.xml文件位置不正确,或者系统正在抑制错误!这很容易解决所有这些在测试脚本:

<?php 
error_reporting(E_ALL | E_STRICT); 
ini_set('display_errors',1); 

include 'app/Mage.php'; 

Mage::setIsDeveloperMode(true); 

Mage::app(); 

var_dump(`Mage::getModel('weblog/blogpost')`); 

最重要的一点是调用setIsDeveloperMode(),因为这将导致Magento的输出错误,它通常会抑制。

如果此时没有抛出解析错误,那么问题必须是模块config.xml中的xpath或值不正确。

+0

谢谢..我在blogpost.php中输错了类名 - - !! – user1470503

+0

这总是一个错字! :-) – benmarks

相关问题