PHP 板


LINE

看板 PHP  RSS
嗨,大家好。 小弟耳闻composer这个套件管理工具很久了,一直觉得很困难而没有弄懂它。 最近终於掌握了它一些,也理解了它的创造理念。 分享这个理解的过程,希望对正要入门composer的朋友有帮助。 有写错的地方希望各位不吝指正。 感恩<( _ _ )> 网页好读版 http://blog.turn.tw/?p=1039 ------------------------------------------------------- 相信有在用PHP的朋友近年来常听到composer这个套件管理工具。 它到底是做什麽用的?又是为了解决什麽问题而存在呢? 要了解这个,得先从历史开始说起…。 PHP最早读取套件的方法 初学PHP时,最早会面对的问题之一就是require与include差别何在? require_once与include_once又是什麽? 弄懂这些问题之後,如果不使用framework,直接开发,便常出现类似这样的code: // whatever.php // 这档案需要用到几个类别 require 'xxx_class.php'; require 'yyy_class.php'; require 'zzz_class.php'; // ... 然後在其他档案会出现: // another.php // 这档案需要用到几个类别 require 'yyy_class.php'; require 'zzz_class.php'; // ... 这样的结果,会产生至少两个问题: 1. 许多档案用到同样几个class,於是在不同地方都需要载入一次。 2. 当类别多了起来,会显得很乱、忘记载入时还会出现error。 那麽,不如试试一种懒惰的作法? 写一个php,负责载入所有类别: // load_everything.php require 'xxx_class.php'; require 'yyy_class.php'; require 'zzz_class.php'; require 'aaa_class.php'; require 'bbb_class.php'; require 'ccc_class.php'; 然後在其他档案都载入这支档案即可: require 'load_everything.php' 结果新问题又来了:当类别很多的时候,随便一个web page都会载入一堆code, 吃爆记忆体,怎麽办呢? __autoload 为了解决这个问题,PHP 5开始提供__autoload这种俗称「magic method」的函式。 当你要使用的类别PHP找不到时,它会将类别名称当成字串丢进这个函式,在PHP喷error投 降之前,做最後的尝试: // autoload.php function __autoload($classname) { if ($classname === 'xxx.php'){ $filename = "./". $classname .".php"; include_once($filename); } else if ($classname === 'yyy.php'){ $filename = "./other_library/". $classname .".php"; include_once($filename); } else if ($classname === 'zzz.php'){ $filename = "./my_library/". $classname .".php"; include_once($filename); } // blah } 也因为PHP这种「投降前最後一次尝试」的行为,有时会让没注意到的人困惑「奇怪我的 code怎麽跑得动?我根本没有require啊..」,所以被称为「magic method」。 如此一来,问题似乎解决了? 可惜还是有小缺点..,就是这个__autoload函式内容会变得很巨大。 以上面的例子来说,一下会去根目录找、一下会去other_library资料夹、 一下会去my_library资料夹寻找。在整理档案的时候,显得有些混乱。 spl_autoload_register 於是PHP从5.1.2开始,多提供了一个函式。 可以多写几个autoload函式,然後注册起来,效果跟直接使用__autoload相同。 现在可以针对不同用途的类别,分批autoload了。 spl_autoload_register('my_library_loader'); spl_autoload_register('other_library_loader'); spl_autoload_register('basic_loader'); function my_library_loader($classname) { $filename = "./my_library/". $classname .".php"; include_once($filename); } function other_library_loader($classname) { $filename = "./other_library/". $classname .".php"; include_once($filename); } function basic_loader($classname) { $filename = "./". $classname .".php"; include_once($filename); } 每个loader内容可以做很多变化。可以多写判断式让它更智慧、可以进行字串处理…。 自动载入类别的问题终於解决了…。 但是光上面的code也有15行,而且在每个project一定都会写类似的东西。有没有办法自动 产生这15行呢? 我的愿望很简单,我告诉你,反正我有my_library资料夹跟other_library资料夹,你自己 进去看到什麽类别就全部载入好不好…? 阿不对,全部载入刚又说效能不好,那你进去看到什麽就全部想办法用 spl_autoload_register记起来好不好…? 我懒得打15行了,我只想打这几个字: $please_autoload = array( 'my_library', 'other_library'); 可不可以发明一个工具,去吃$please_autoload这个变数,然後自己想办法载入一切啊…? ㄟ等等,我连php程式码都懒得打了,在web领域JSON格式更简洁。允许我这样打,好吗? { "autoload": [ "my_library", "other_library" ] } 然後谁来个工具帮我产生一大串autoload相关的php程式码吧…,可以吗? 可以。 Composer登场 首先,装好composer(本文不介绍如何安装。) 再来,建立一个composer.json档,里面输入这些: { "autoload": { "classmap": [ "my_library", "other_library" ] } } 比原本希望的多打了一些字,不过差不多。 再来,在terminal输入 composer install 执行成功之後,你会看到一个vendor资料夹,内含一个autoload.php。 没错,跟你梦想的一样。你只要载入这个档案: require 'vendor/autoload.php'; 你需要的所有类别,都会在适当的时候、以适当的方式自动载入。 php再也不会喷error说你「类别尚未定义」了! 这vendor资料夹里面的一切,都只是php code而已,并没有特别神奇的地方。只要去看 autoload.php的原始码,就能知道composer到底写了哪些php code给你。 ㄟ等等,我写的类别都放在my_library里面了,other_library都是网路上copy下来的现成 类别。我想要用Google API的Client类别、Doctrine资料库管理抽象层类别、还有 guzzlehttp的发送request类别。 我连去下载这些档案、然後丢进这个资料夹都懒得做了,我根本不想手动建立 other_library这个资料夹。composer真那麽神…不如连下载都帮我自动下载?可以吗? 可以。 查询一下那几个套件在「https://packagist.org/」的名称、还有你需要的版本号。 把刚刚的composer.json改成这样: { "require": { "google/apiclient": "1.0.*@beta", "guzzlehttp/guzzle": "~4.0", "doctrine/dbal": "~2.4" }, "autoload": { "classmap": [ "my_library" ] } } 然後’composer install’指令除了自动载入你的类别之外、 还会自动下载你需要的类别、然後自动载入它们。 一样require ‘vendor/autoload.php’就可以了。 composer实在是太棒了。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.229.213.31
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/PHP/M.1416476586.A.C3E.html
1F:推 crossdunk: 推 11/20 17:45
2F:推 onininon: 有看有推 11/20 17:56
3F:推 rickysu: 推 11/20 18:04
4F:推 lucky1lk: 不错 11/20 18:48
5F:推 KawasumiMai: 目前还停留在require一个all_require的阶段XDD 11/20 19:08
6F:推 martin77: 推, 说明得很棒 11/20 23:38
7F:推 ga013077: 推 11/21 07:22
8F:推 alex0914: 有懂有推 11/21 22:48
9F:推 xdraculax: 推 虽然我懒得安装宁可自己写@@ 11/22 00:48
10F:推 aoeeoak: 有看有懂,很喜欢这种风格的教学文 11/22 02:03
11F:推 windwofswold: 下完composer指令後可以去泡茶 12/01 01:58
12F:推 ottokang: Composer好用,给推 12/08 09:50
13F:→ Laravel: 推 12/09 16:14
14F:→ serinasky: 推 02/23 02:17
15F:推 theren: 有懂有推 09/19 12:05







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP