php composer自动加载,composer自动加载讲解

>[info]总结:

PSR-0与PSR-4自动加载格式: root命名空间:起始路径(从composer.json同级目录算起)

~~~

"psr-0 | 4":{

"root命名空间\\":"起始路径",

},

~~~

## **PSR-0:**

例子:

~~~

"psr-0":{

"church\\":"./src/",

},

~~~

此定义的类文件必须定义在composer.json同级目录下的src/church/文件夹下:

>[info]起始路径+root命名空间 + \[额外路径\] + 类文件(必须与类名完全一致)

>[danger] 不光是类文件,还有文件夹这些都对大小写敏感

> 实例化调用时记得加载composer的autoload.php

```

test 应用目录

├─src目录

│ ├─church目录

│ │ ├─TestClass1.php

│ │ ├─TestClass2.php

│ │ └─ ... 更多类文件

│ └─

├─composer.json composer 定义文件

```

定义映射的类:

>[info]类名与文件名完全一致 且 类名必须声明 namespace root命名空间\[\\额外路径

```

namespace church;

class TestClass1{

}

```

使用:

>[info]use root命名空间\[\\额外路径\]\\类名;

new 类名();

或者完全限定

>[info]new \\root命名空间\[\\额外路径\]\\类名()

```

//注意是文件与的类文件及类大小写一致,不只是其中一个

use church\TestClass1;

new TestClass1();

//或者直接new

new \church\TestClass1();

```

例子2:

```

//类文件必须定义在composer.json同级目录下的src/church/Dash/文件夹下

"psr-0":{

"church\\Dash\\":"./src/",

},

```

定义:

```

namespace church\Dash;

class TestClass1{

}

```

使用:

```

//注意是文件与的类文件及类大小写一致,不只是其中一个

use church\Dash\TestClass1;

new TestClass1();

//或者直接new

new \church\Dash\TestClass1();

```

例子3同理:

```

//类文件必须定义在composer.json同级目录下的Church/文件夹下

"psr-0":{

"Church\\":"",

},

```

定义:

```

namespace Church;

class TestClass1{

}

```

使用:

```

//注意是文件与的类文件及类大小写一致,不只是其中一个

use Church\TestClass1;

new TestClass1();

//或者直接new

new \Church\TestClass1();

```

## **PSR-4:**

>PSR-4 相对于PSR-0 在对应文件路径时可以省略root命名空间

对应文件路径:

>[info]起始路径+ \[额外路径\] + 类文件(必须与类名一致)

例子1:

~~~

"psr-4":{

//"root命名空间\\":"起始路径", 例root命名空间 "Dash\\"或者"Dash\\test\\"

"Dash\\":"./src/",

},

~~~

此定义的类文件必须定义在composer.json同级目录下的src及其子文件夹下

>[warning]src/church/TestClass1.php

定义:

~~~

namespace Dash/church;

class TestClass1{

}

~~~

使用:

>use root命名空间\[\\额外路径\]\\类名

>new \\root命名空间\[\\额外路径\]\\类名()

~~~

use Dash\church\TestClass1;

new TestClass1();

//或者直接new

new \Dash\church\TestClass1();

~~~

>[warning]src/TestClass1.php

定义:

~~~

namespace Dash;

class TestClass1{

}

~~~

使用:

~~~

use Dash\TestClass1;

new TestClass1();

//或者直接new

new \Dash\TestClass1();

~~~

例子2:

~~~

"psr-4":{

//"root命名空间\\":"起始路径",

"Dash\\tools\\":"./src/",

},

~~~

此定义的类文件必须定义在composer.json同级目录下的src及其子文件夹下

>[warning]src/TestClass1.php

定义:

~~~

namespace Dash\tools;

class TestClass1{

}

~~~

使用:

~~~

use Dash\tools\TestClass1;

new TestClass1();

//或者直接new

new \Dash\tools\TestClass1();

~~~

>[warning]src/church/TestClass1.php

定义:

~~~

namespace Dash\tools\church;

class TestClass1{

}

~~~

使用:

~~~

use Dash\tools\church\TestClass1;

new TestClass1();

//或者直接new

new \Dash\tools\church\TestClass1();

~~~

psr-4比psr-0路径更简洁

## **files**

>[info]一般用来自动加载函数、配置等非类文件

~~~

"files":[

"src/MyLibrary/functions.php"

],

//以上定义会自动加载与composer.json同文件夹下的src/MyLibrary/functions.php

~~~

## **classmap**

>[info] 适合没有命名空间的类

定义后必须要有src和lib文件夹

~~~

"classmap":[

"src/",

"lib/"

]

~~~

>[info]当Composer开始安装和更新扩展的时候,会根据composer.json里的这个autoload告诉的方式classmap,

来遍历src、lib目录然后将里面的类文件和其路径一一对应,存放到vendor/composer/autoload_classmap.php内

>src/文件下必须有文件并且定义了类才会被加载到classmap

总览:

~~~

"autoload":{

"psr-0":{

//简单理解将./src路径替换为church 所以 src里的类文件必须有namespace church

"church\\":"./src/",

#use church\testClass, 那就对应src/church/testClass.php.

#use church\test\testClass, 那就对应src/church/test/testClass.php

"Test\\" :"core/", #composer update后 ./vender/composer/autoload_psr4.php的 数组里会多出'Test\\' => array($baseDir . '/core'),

"UniqueGlobalClass": "" # 这个类的php源文件也位于包的根目录

},

"psr-4":{

"church\\":"./src/",

# use church\TestClass, 那就对应src/testClass.php.

# use church\Test\TestClass, 那就对应src/test/testClass.php

#

"Dash\\":["extra/","library/"], #多个目录中一个相同的(命名空间)前缀 psr-0 也适用

"":"any/" #任何命名空间(即实例化类时其他地方未定义,那么就会进入any查找) 设置一个目录作为任何命名空间的备用目录psr-0也适用

"thinkcms\\auth\\": "" //加载此composer.json同及目录及其子目录下的的所有文件?

},

"files":[

"src/MyLibrary/functions.php" #一般用来自动加载函数、配置等非类文件

],

#当Composer开始安装和更新扩展的时候,会根据composer.json里的这个autoload告诉的方式classmap,

#来遍历src、lib目录然后将里面的类文件和其路径一一对应,存放到vendor/composer/autoload_classmap.php内

#src/文件下必须有文件并且定义了类才会被加载到classmap

"classmap":[

"src/",

"lib/"

]

}

~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值