Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
92 views
in Technique[技术] by (71.8m points)

如何导入这个类?

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 MetowolfMeting;

$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 MetowolfMeting;
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 MetowolfMeting;
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

还是不行


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

下面 ${PROJ} 为工程目录

<?php

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

use MetowolfMeting;
$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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...