zoukankan      html  css  js  c++  java
  • [转]php composer使用

    原文: https://zhuanlan.zhihu.com/p/133857206

    ---------------------------------

    Composer是一个非常流行的PHP包依赖管理工具,已经取代PEAR包管理器,对于PHP开发者来说掌握Composer是必须的.

    对于使用者来说Composer非常的简单,通过简单的一条命令将需要的代码包下载到vendor目录下,然后开发者就可以引入包并使用了.

    其中的关键在于你项目定义的composer.json,可以定义项目需要依赖的包(可能有多个),而依赖的包可能又依赖其他的包(这就是组件的好处),这些都不用你烦心,Composer会自动下载你需要的一切,一切在于composer.json的定义.

    Composer对于使用者来说是很透明,但是其背后的理念还是需要了解一下的,其的诞生也不是偶然的,得益于Github的快速发展,PHP语言也越来越现代化,显得更高大上了.

    要了解这个,得先从历史开始说起…

    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';
    // ...
    

    这样的结果,会产生至少两个问题:

    许多档案用到同样几个class,于是在不同地方都需要载入一次。当类别多了起来,会显得很乱、忘记载入时还会出现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内容可以做很多变化。可以多写判断式让它更智慧、可以进行字串处理…。自动载入类别的问题终于解决了… 但是一大串一大串的autoload,手动去写这些,很麻烦,这个时候就会想到能不能用一种工具直接去生成呢?这个时候就有了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给你。

    最后提供一个扩展包下载,直接用composer就好了。

    查询一下那几个套件在“”的名称、还有你需要的版本号。

    把刚刚的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就可以了。

  • 相关阅读:
    为知笔记 Markdown 新手指南
    如何在服务器正确的看日志呢?
    如何查看网络之间是否互通
    自定义异常以及异常的处理
    记录下工作中用到的Linux命令
    fastJson中常用方法以及遇到的“坑”
    Java语法清单-快速回顾(开发)
    kafka的简单命令
    Elasticsearch集群状态查看命令
    ElasticSearch学习文档2018.11
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14235691.html
Copyright © 2011-2022 走看看