如何导入这个类?

composer require metowolf/meting

cd  .config/composer/vendor/metowolf
debian@MiWiFi-R3-srv:~/.config/composer/vendor/metowolf$ tree
.
└── meting
    ├── composer.json
    ├── LICENSE
    ├── README.md
    └── src
        └── Meting.php

2 directories, 4 files

我想使用Meting.php,github上的文档这样写:

use Metowolf\Meting;

$api = new Meting('netease');

$data = $api->format(true)->search('Soldier');

我这样写

cd /home/debian/.config/composer/vendor
php -a

php > include('metowolf/meting/src/Meting.php');
php > use Metowolf\Meting;
php > $api = new Meting('netease');
PHP Warning:  Uncaught Error: Class 'Meting' not found in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1

请问,如何解决?

php > echo __DIR__;
/home/debian/.config/composer/vendor/metowolf
php > require __DIR__ . '/../vendor/autoload.php';
PHP Warning:  require(/home/debian/.config/composer/vendor/metowolf/../vendor/autoload.php): failed to open stream: No such file or directory in php shell code on line 1
PHP Fatal error:  require(): Failed opening required '/home/debian/.config/composer/vendor/metowolf/../vendor/autoload.php' (include_path='.:/usr/share/php') in php shell code on line 1

来个笨办法

php > require '/home/debian/.config/composer/vendor/autoload.php';
php > use Metowolf\Meting;
php > $api = new Meting('netease');
PHP Warning:  Uncaught Error: Class 'Meting' not found in php shell code:1
Stack trace:
#0 {main}
  thrown in php shell code on line 1

还是不行

阅读 1.7k
1 个回答

使用 Composer, 你需要加载 composer 提供的 autoload.php
具体的目标类所在的文件则不需要手动 require/include (由 autoload 加载完成)

下面 ${PROJ} 为工程目录

<?php

# 假定此文件为 ${PROJ}/public/index.php
require __DIR__ . '/../vendor/autoload.php';

use Metowolf\Meting;
$api = new Meting('netease');

autoload.php 在你的整个会话中仅需要加载一次即可

当然你自己的代码也强烈建议遵循 PSR-4 或者至少是 PSR-0 的规范

详细了解可自行搜索


题主修改了问题, 经测试, php -a交互式命令行似乎确实无法正常运行 composer 的 autoload, 所以需要运行上面例子代码的一个合理的composer 工程结构大概是这样的:

$ cd ${PROJ}
$ composer require metowolf/meting
$ mkdir public
$ touch public/index.php
$ tree
.
├── composer.json
├── composer.lock
├── public
│   └── index.php
└── vendor
    ├── autoload.php
    ├── composer
    │   ├── ClassLoader.php
    │   ├── LICENSE
    │   ├── autoload_classmap.php
    │   ├── autoload_namespaces.php
    │   ├── autoload_psr4.php
    │   ├── autoload_real.php
    │   ├── autoload_static.php
    │   └── installed.json
    └── metowolf
        └── meting
            ├── LICENSE
            ├── README.md
            ├── composer.json
            └── src
                └── Meting.php

再度补充:

PHP 官网的确说明了 Autoload 这个特性在命令行界面上不可用:
https://www.php.net/manual/en/features.commandline.interactive.php , 文末的有一个 note

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题