Re: [请益] 关于 autoload

楼主: GALINE (天真可爱CQD)   2015-05-16 03:11:39
PHP 的 autoload 扯到了几项相近却不相同的东西,感觉应该明确提一下..
## __autoload() ##
https://php.net/manual/en/function.autoload.php
__autoload() 这个 function 可以让你定义“要加载某个 class 的时候该做什么”
这是 PHP 尝试解救 require 地狱的第一步。不过他有几个问题
- 没办法在程式执行中改变内容,你得把所有的加载逻辑写死在这个 function 里面
- 他只能定义一种动态加载的方法。如果今天所有的 class 都是自己写的
那还好解决,自己决定好档案怎么放就可以。如果今天是好几组人写
甚至是引用到其他人写的 code,那就会变成引用一次就要改写一次 class loader
其实很麻烦。
- 由于以上理由,以及后来有了 spl_autoload_register()
他“未来有可能”会被 deprecated。
- 江湖盛传这东西效能不好,不过我自己没什么用这东西的经验。
而且问题有可能在于 PHP 加载 class 的效能本来就不好...
- 大家都会乱想一些奇怪的 Class Name 跟档案路径定义,最后还是只有原本写 code
的人能找到那个 Class
## spl_autolaod_register() ##
https://php.net/manual/en/function.spl-autoload-register.php
spl_autolaod_register() 跟 __autoload() 差别有二
- 可以指定多个动态加载的方法
- 可以在执行的时候依照需要挂上不同的动态加载逻辑
这让 spl_autoload_register() 的使用弹性比 __autoload() 大很多。
现在这年头大概都是走这条路。
不过,大家还是会乱想一些奇怪的 Class Name 跟档案路径对应
最后还是只有原本写 code 的人能找到那个 Class....
## PSR-0/PSR-4 ##
http://blog.mosil.biz/2012/08/psr-0-autoloading-standard/
https://jasteralan.github.io/psr4/
PSR-0 跟 PSR-4 并不是 PHP 的功能,而是对程式设计师的道德劝说
“麻烦你们以后要做 autloading 的话,class 档案都这样设计,路径都这么放”
这东西要解决的是“大家还是会乱想一些奇怪的 class 档案对应”这个问题
遵守这规范的人,只要看到 class 的名字就大概能知道档案会放在哪里
理论上你不管用 __autoload() 还是 spl_autoload_register() 都能写出符合
PSR-0 或 PSR-4 需求的自动加载机制。
PSR-0 跟 PSR-4 是两个不同的规范,大同但小异。
PSR-0 可以(有点别扭的)在 PHP 5.2 使用,PSR-4 就必须要用 PHP 5.3 以上了
===============================================================
所以 composer 的自动加载大致上是
“用 spl_autoload_register() 实作了符合 PSR-0/PSR-4 规范的 autoloader”
不过 PSR-0/PSR-4 的自动加载机制非常依赖 namespace
在这样的规范下你的 Class 应该要取名成“\PTT\Board\PHP”这种感觉
写习惯其他 OO 语言(尤其是Java,整个风格超像...)的人会觉得很顺手
但是写习惯 PHP 5.2 以前的东西的人要用 namespace 应该会有一段适应期...
虽然 composer 的 autoloading 还可以设定 classmap 这种
“反正就是把整个资料夹扫过看有哪些 class 可以加载通通记起来”的搞法
可以避开 PSR-0/PSR-4
作者: tkdmaf (皮皮快跑)   2015-05-16 08:32:00
反正就是新规则,新标准,想办法自己适应就是了。每件事都嘛有阵痛期,痛完就爽了。

Links booklink

Contact Us: admin [ a t ] ucptt.com