2010-01-19 75 views
0

我是新來的Zend Framework所以也許這個問題很愚蠢..通過模型擴展的Zend Framework自動加載類

我有一個默認分級

網站
| --bootstrap.php
| --application
| --models
      | - Item.php
      | - ModelAbstract.php
| --...

內Item.php有

<?php 
    //TODO: trying to remove this require... 
    require_once('ModelAbstract.php'); 

    class CF_Model_Flower extends CF_Model_Abstract 
    { 
     ... 

裏面 'ModelAbstract.php' 有

<?php 

    class CF_Model_Abstract 
    { 
    ... 

而且我的應用程序的啓動過程。 PHP看起來像

<?php 

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initAutoload() 
    { 
     $autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'CF', 
      'basePath' => dirname(__FILE__), 
     )); 
     return $autoloader; 
    } 
    ... 

如果我刪除'require_once'內部項目.php我得到

Fatal error: Class 'CF_Model_Abstract' not found in /Mysite/application/models/Item.php on line 6 

爲什麼?如何在沒有這個require_once的情況下使用自動加載?

實際上,將'ModelAbstract.php'重命名爲'Abstract.php'是有效的。有人可以解釋我爲什麼嗎?

THX

回答

0

我不熟悉Zend_Application_Module_Autoloader和這樣的。但是,如果他們的工作類似的東西早期ZF自動加載機制,自動裝載機將尋找類CF_Model_Abstract在:

CF/Model/Abstract.php

或可能與這個命名空間/基本路徑配置:

models/Model/Abstract.php

或:

models/CF/Model/Abstract.php

BU牛逼可能不是:

models/ModelAbstract.php

所以換句話說,下劃線代表子目錄。

+0

你給了我一個嚴肅的提示,我剛剛將'ModelAbstract.php'重命名爲'Abstract.php',它的工作! 我只是不知道爲什麼: -/ 我認爲命名空間用於前綴類的前綴從Zend_Application_Module_Autoloader從'basePath'檢查一些默認資源,即在'模型'目錄中,它將搜索像「CF_Model_XXX」類。我認爲文件名在這種情況下毫無意義。 – 2010-01-20 15:39:33

0

嘗試在命名空間中指定_。

$autoloader = new Zend_Application_Module_Autoloader(array(
      'namespace' => 'CF_', 
      'basePath' => dirname(__FILE__), 
)); 
+0

它不工作:( – 2010-01-20 15:41:10

0

將在引導文件如下:

protected function _initAutoLoad() 
{ 
    $loader = new Zend_Loader_Autoloader_Resource(array(
     'basePath' => APPLICATION_PATH, 
     'namespace' => 'CF', 
    )); 

    $loader->addResourceType('form', 'forms', 'Form') 
     ->addResourceType('model', 'models', 'Model') 
     ->addResourceType('mapper', 'models/mappers', 'Model_Mapper') 
     ->addResourceType('dbtable', 'models/DbTable', 'Model_DbTable'); 
    return $loader; 
} 

這將加載模式,形式,dbtables,和映射器爲您服務。希望這可以做到。