자동 로딩 클래스 __autoload() 사용법에 대한 간략한 소개

伊谢尔伦
풀어 주다: 2023-03-12 09:10:01
원래의
1788명이 탐색했습니다.

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

<?php
#a.php

class A{
    public function funA()
    {
        echo &#39;The class:&#39;.class.&#39;<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.php

class MyClass {

    public function getNamespace()
    {
        return get_class($this);
    }
}
로그인 후 복사

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

<?php

function autoload($name)
{
    $file = realpath(DIR).&#39;/&#39;.$name.&#39;.php&#39;;
    if(file_exists($file))
        {
                require_once($file);
        if(class_exists($name,false))
                {
            return true;
                }
                return false;
          }
          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() 사용법에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!