首页 > 编程 > PHP > 正文

Zend Framework自动加载类的实现方法

2020-03-22 19:56:31
字体:
来源:转载
供稿:网友
  • Zend Framework中实现自动加载类。网上查了很多,有好几种。本文收集了常用的3种,

    第一种如下:

    E0FD4B173A4E45AA9F26C3AFC6D84587

    方法很简单,举例说明。比如想要在models目录下的类可以自动加载。

    先在index.php中修改include path。


    // Ensure library/ is on include_path set_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的文件。内容如下:

    <?php html' target='_blank'>class Nav  { public static function getNav() {    echo "pfpf"; } } ?>

    在某个controller中,直接使用Nav类。

    Nav::getNav();

    如果models中需要加文件夹,那么相应的类名也要有更改。举例:

    412A0F3703C3416683E6FAB52D3C637A

    在models下有新建一个newFolder文件夹,在该文件夹下面新建一个文件MKA,那么这个文件中的类名就应该是newFolder_MKA这种约定。


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

    默认的,index.php中已经包含了 realpath(APPLICATION_PATH . '/../library')这个路径,即可以直接把类放到这个文件夹中,既可以实现自动加载。

    还有一种方法,和上述方法类似,只不过在资源方法中实现注册命名空间(这里命名空间的概念和C#中命名空间概念不太一样,这里指的是类名前面的前缀和包含类的文件夹)。假设要自动加载的类在library中,默认的index.php中的includepath已经包含了。

    E4A273299421470DA005954200E29941

    那么这些类名也要按约定加上命名空间前缀,在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_这样的类。

    具体看下面的例子,目录结构图如下:

    ADN0FC$CI[_JCYVGZN(D)F1

    那现在的目标是能够自动加载没有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'); }

    其中注意命名空间首字母大写,路径要指对,然后具体的类名要符合响应的规则。比如例子中的类名的格式就是

    命名空间_子命名空间_类名的格式。

    具体如下:


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

    然后调用的是直接

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

    就可以了。

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表