2012-06-20 62 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

相關問題