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
还是不行
###使用 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