• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

简单介绍自动加载类__autoload()用法

php 搞代码 4年前 (2022-01-22) 20次浏览 已收录 0个评论

在面向对象编程中,都是以对象为单位的操作,如果我有两个不同的类,类A和类B,在同一个文件里,实例化对象,就能在这个文件同时调用类A和类B的函数

<?php#a.phpclass A{    public function funA()    {        echo 'The class:'.class.'<br/>';    }}class B{    public function funB()    {        echo 'The class:'.class.'<br/>';    }}$a = new A();$b = new B();$a->funA(); //The class:A$b->funB(); //The class:B

两个类都在同一个文件,所有能运行成功,但现在大部分应用都分MVC,不同类专门处理特定的事物,比如C(Controller),只执行与事物有关的逻辑操作,这些文件很明显分属于不同目录下:

|—root

|—controller

|—controllerA.php

|—model

  |—modelA.php

  |—view

|—viewA.php

这时我要在modelA.php里怎么引用controllerA.php的函数呢?这就用到autoload()了。

<?php#保存在MyClass.phpclass MyClass {    public function getNamespace()    {        return get_class($this);    }}

现在我们在同级目录下引用这个类

<?phpfunction autoload($name){    $file = realpath(DIR).'/'.$name.'.php';    if(file_exists($file))        {                require_once($file);        if(class_exists($name,false))                {            return true;                }                return false; <div>本文#来源gaodai.ma#com搞##代!^码7网</div><pre>搞代gaodaima码

} return false;}$obj = new MyClass();echo $obj->getNamespace(); //输出 MyClass;

当你引用不存在的类时,autoload就会被调用,并且你的类名会被作为参数传送过去(当你同时使用命名空间,包含命名空间部分会一起作为参数传送)。

下面我们把命名空间和自动加载类合并使用

命名空间,PHP从5.3开始支持命名空间(namespace),这个在C语言里非常常见,刚开始我不理解,直到我完整接触一个项目,需要加载在不同目录下Class时,恍然大悟。OK,下面讲一讲自己的理解吧。

用不同的命名空间区别相同的函数名,同时命名空间也可以作为引入类文件的路径。

(在WEB项目中,当在client输入一个url时,一般会有一个入口文件,在这个文件里解析你要调用的controller,以及传递的参数,然后动态的加载相应类文件,这其实就牵扯到一点路由规则,当然还有另外一种,在项目初始化之初就把所有类文件全部加载在内存中,这样,每次请求响应都不用再加载,常驻内存后响应要快点。)

<?php#首先建立一个MyClass目录,在该目录下新MyClass.php文件,代码如下。namespace MyClass;class MyClass {        public function getNamespace()        {                return get_class($this);        }}

<?php#在跟MyClass目录同级的目录下,新建一个文件,内容如下function autoload($name){    $class_path = str_replace('\\',DIRECTORY_SEPARATOR,$name);   //把表示命名空间的分割符号,转换成表示目录结构的斜线    $file = realpath(DIR).'/'.$class_path.'.php';       if(file_exists($file))        {                require_once($file);    //引入文件        if(class_exists($name,false))    //带有命名空间的类名                {            return true;                }                return false;          }          return false;}echo MyClass\MyClass::getNamespace();    //输出: MyClass\MyClass;

这样非常容易避免了,当一个项目非常大时,不停的require文件。

让我们再思考,有没有更工程化的解决方案?当然有,我们可以建立自己的 Autoload 类,在这个类里面自动加载不同的类(可以包含命名空间),需要引用其他类的文件,只需要显示写入这个 Autoload 类即可。

以上就是简单介绍自动加载类__autoload()用法的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:简单介绍自动加载类__autoload()用法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址