Zend Framework 自動載入類的實現方法

來源:互聯網
上載者:User

Zend Framework中實現自動載入類。網上查了很多,有好幾種。本文收集了常用的3種,

第一種如下:

650) this.width=650;" style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" title="E0FD4B173A4E45AA9F26C3AFC6D84587" border="0" alt="E0FD4B173A4E45AA9F26C3AFC6D84587" src="http://www.bkjia.com/uploads/allimg/131228/144050B47-0.jpg" height="501" />

方法很簡單,舉例說明。比如想要在models目錄下的類可以自動載入。

先在index.php中修改include path。

// Ensure library/ is on include_pathset_include_path(implode(PATH_SEPARATOR, array(    realpath(APPLICATION_PATH . '/../library'),    get_include_path(),realpath(APPLICATION_PATH . '/models'))));

上述代碼裡,添加包含了models的目錄。

然後在Bootstrap.php檔案下,實現一個資源方法。

protected function _initAutoload(){            $autoloader = Zend_Loader_Autoloader::getInstance();            $autoloader->setFallbackAutoloader(true);          }

然後在models裡可以加一個類。注意檔案名稱和類名的關係類名要加上路徑名,用_隔開。下有樣本),不然自動載入會失敗。比如加一個Nav.php的檔案。內容如下:

<?phpclass Nav  {public static function getNav() {   echo "pfpf";}}?>

在某個controller中,直接使用Nav類。

Nav::getNav();

如果models中需要加檔案夾,那麼相應的類名也要有更改。舉例:

650) this.width=650;" style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" title="412A0F3703C3416683E6FAB52D3C637A" border="0" alt="412A0F3703C3416683E6FAB52D3C637A" src="http://www.bkjia.com/uploads/allimg/131228/1440502193-1.jpg" height="76" />

在models下有建立一個newFolder檔案夾,在該檔案夾下面建立一個檔案MKA,那麼這個檔案中的類名就應該是newFolder_MKA這種約定。

<?phpclass newFolder_MKA  {public static function getNav() {echo "<br>MKA";}}?>

預設的,index.php中已經包含了 realpath(APPLICATION_PATH . '/../library')這個路徑,即可以直接把類放到這個檔案夾中,既可以實現自動載入。

————————————————————————————————————————————————

還有一種方法,和上述方法類似,只不過在資源方法中實現註冊命名空間這裡命名空間的概念和C#中命名空間概念不太一樣,這裡指的是類名前面的首碼和包含類的檔案夾)。假設要自動載入的類在library中,預設的index.php中的includepath已經包含了。

650) this.width=650;" style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" title="E4A273299421470DA005954200E29941" border="0" alt="E4A273299421470DA005954200E29941" src="http://img1.51cto.com/attachment/201309/24/2359144_1379989042AsJs.jpg" height="193" />

那麼這些類名也要按約定加上命名空間首碼,在My目錄下的加上My_,沒有目錄的就加_。這樣的話,資源方法中只需註冊一下命名空間就行了。

protected function _initAutoload (){    Zend_Loader_Autoloader::getInstance()    ->registerNamespace('My_')    ->registerNamespace('_');}

然後就可以直接調用My_Book類和_Pen類了。

My_Book::show();

_Pen::show();

甚至,你也不需要在資源方法中加代碼,只需在設定檔application.ini中加入如下指令即可:

autoloaderNamespaces[] = "My_"autoloaderNamespaces[] = "_"

————————————————————————————————————————————————

還有一種方法 ,採用Zend_Loader_Autoloader_Resource類。

看例子,在Bootstrap.php檔案下,寫一個資源方法。

        protected function _initAutoload(){            $loader = new Zend_Loader_Autoloader_Resource(array('basePath'  => APPLICATION_PATH ,//這裡指定任何路徑,指定路徑後就在這個路徑下找'namespace' => 'Foo',//這裡的命名空間值的是類的首碼,比如這個就是類的首碼是Foo_開頭的。            ));            $loader->addResourceType('wwww', 'models', 'Modelxxx');//這個方法三個參數,分別是資源類型貌似可以隨便填),路徑,子命名空間               //下面是源碼中對於這3個參數的說明               /**     * Add resource type     *     * @param  string $type identifier for the resource type being loaded     * @param  string $path path relative to resource base path containing the resource types     * @param  null|string $namespace sub-component namespace to append to base namespace that qualifies this resource type     * @return Zend_Loader_Autoloader_Resource     */}

例如上面的例子,它會在APPLICATION_PATH\models\目錄下,自動載入Foo_Modelxxx_這樣的類。

具體看下面的例子,目錄結構圖如下:

650) this.width=650;" style="border-bottom:0px;border-left:0px;border-top:0px;border-right:0px;" title="ADN0FC$CI[_JCYVGZN(D)F1" border="0" alt="ADN0FC$CI[_JCYVGZN(D)F1" src="http://img1.51cto.com/attachment/201309/24/2359144_13799890433MI7.jpg" height="261" />

那現在的目標是能夠自動載入沒有folder中的類。

對應的,第一步,指定好自動載入的basepath,即'basePath' => APPLICATION_PATH.'/myfolder',指定一個命名空間Myns。

注意命名空間的首字母大寫,不然報錯。

接著,載入資源類型,指定更細節的路徑和命名空間。

所有的代碼如下:

protected function _initAutoload(){            $loader = new Zend_Loader_Autoloader_Resource(array('basePath'  => APPLICATION_PATH.'/myfolder','namespace' => 'Myns'            ));            $loader->addResourceType('mytype', '/', 'Mysubns')            ->addResourceType('mytype2', 'mysubfolder', 'Mysubns2');}

其中注意命名空間首字母大寫,路徑要指對,然後具體的類名要符合響應的規則。比如例子中的類名的格式就是

命名空間_子命名空間_類名的格式。

具體如下:

<?phpclass Myns_Mysubns2_Myclass2{    public static function show()    {echo "myns_mysubns2_myclass2","<br>";    }}?>
<?phpclass Myns_Mysubns_Myclass{    public static function show()    {echo "myns_mysubns_myclass","<br>";    }}?>

然後調用的是直接

Myns_Mysubns_Myclass::show();Myns_Mysubns2_Myclass2::show();

就可以了。

本文出自 “一隻部落格” 部落格,請務必保留此出處http://cnn237111.blog.51cto.com/2359144/1300913

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.