Magento警告:get_class()要求参数1为对象,给定布尔值

Magento警告:get_class()要求参数1为对象,给定布尔值,magento,Magento,我遵循Magento开发教程Magento for Developers:第5部分-Magento模型和ORM基础 当我尝试回显类名时,我得到以下错误。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\IndexContr

我遵循Magento开发教程Magento for Developers:第5部分-Magento模型和ORM基础

当我尝试回显类名时,我得到以下错误。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}
文件:app\code\local\Microdatanet\Weblog\controllers\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); 
    }
}
?>

文件:app\code\local\Microdatanet\Weblog\etc\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>

0.1.0
Microdatanet_Weblog_模型
weblog_mysql4
微数据网、网络日志、模型、Mysql4
标准
Microdatanet_博客
网络日志
文件:app\code\local\Microdatanet\Weblog\Model\Blogpost.php

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

当类无法通过Magento工厂方法实例化时,有多种调试方法。鉴于Magento大量使用配置和特定惯例,学习如何在Magento中执行鉴别诊断非常重要

Magento中的所有类定义都(应该)通过自动加载程序(
Varien_Autoload
)加载,该程序在中调用,并依赖于
app/Mage.php
中的包含路径设置:

$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需要查找的所有类定义就是,相对于上面的include路径,类名与文件的路径相匹配。这种类型的自动加载方案在PHP项目中非常普遍

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

$obj = new Microdatanet_Weblog_Model_Blogpost;
如果PHP找不到类定义,那么这将抛出一个致命错误。如果可以找到类定义,那很好,有两件事是正确的:给定传递给
new
的类名,文件路径是正确的,而
Blogpost.php
文件中的类名是正确的

同样,这是目前PHP中典型的自动加载方案。Magento所做的是使用一些方法根据XML中的一些信息
构建
类名。仅供参考,此工厂方法方法只提供两个有用的用途:允许运行时类名重写,以及在注册表中注册单个实例

假设可以如上所述调用该类,如果
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')`);

当类无法通过Magento工厂方法实例化时,有多种调试方法。鉴于Magento大量使用配置和特定惯例,学习如何在Magento中执行鉴别诊断非常重要

Magento中的所有类定义都(应该)通过自动加载程序(
Varien_Autoload
)加载,该程序在中调用,并依赖于
app/Mage.php
中的包含路径设置:

$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需要查找的所有类定义就是,相对于上面的include路径,类名与文件的路径相匹配。这种类型的自动加载方案在PHP项目中非常普遍

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

$obj = new Microdatanet_Weblog_Model_Blogpost;
如果PHP找不到类定义,那么这将抛出一个致命错误。如果可以找到类定义,那很好,有两件事是正确的:给定传递给
new
的类名,文件路径是正确的,而
Blogpost.php
文件中的类名是正确的

同样,这是目前PHP中典型的自动加载方案。Magento所做的是使用一些方法根据XML中的一些信息
构建
类名。仅供参考,此工厂方法方法只提供两个有用的用途:允许运行时类名重写,以及在注册表中注册单个实例

假设可以如上所述调用该类,如果
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')`);