作者GALINE (天真可爱CQD)
看板PHP
标题Re: [请益] 关於 autoload
时间Sat May 16 03:11:39 2015
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
--
______ ____________________________________ _ _-_ _ ___
/ __||____________________________________| _|_|.---'---`---.|_|_ |___)
|___| Let it go! Let it go! \----._________.----/
___ Where no man has gone before! `. `]-[' ,'
| |__ _________________________________________ `.' _ `.' ________
\______||_________________________________________| |_(_)_| |________)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.27.63.55
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1431717108.A.736.html
1F:推 tkdmaf: 反正就是新规则,新标准,想办法自己适应就是了。 05/16 08:32
2F:→ tkdmaf: 每件事都嘛有阵痛期,痛完就爽了。 05/16 08:32