问答

如何导入这个类?

作者:admin 2021-06-07 我要评论

composer require metowolf/metingcd .config/composer/vendor/metowolfdebian@MiWiFi-R3-srv:~/.config/composer/vendor/metowolf$ tree.└── meting ├── ...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • PHP-fpm怎么实现进程间同步与互斥的?

    PHP-fpm怎么实现进程间同步与互斥的?

  • ts类型问题

    ts类型问题

  • js不带引号的对象格式字符串怎么转为对

    js不带引号的对象格式字符串怎么转为对

  • Number.prototype.toFixed() 四舍五入

    Number.prototype.toFixed() 四舍五入

腾讯云代理商
海外云服务器