【问题标题】:Class not found after composer require [duplicate]在作曲家需要后找不到类[重复]
【发布时间】:2020-01-27 10:59:06
【问题描述】:

我正在关注article学习php和composer

我尝试使用外部依赖composer require phpunit/php-timer

这是我的 composer.json:

{
  "name": "ypapax/composer_php_hello_world_log4php",
  "minimum-stability": "dev",
  "require": {
    "php": ">= 7.2",
    "phpunit/php-timer": "^2.1@dev"
  },
  "autoload": {
    "psr-0": {
      "HelloWorld": "src/"
    },
    "classname": {
      "PHP_Timer": "src/"
    }
  }
}

还有我的test.php

<?php

// Autoload files using Composer autoloader.
require_once __DIR__ . '/../vendor/autoload.php';

use HelloWorld\Greetings;

echo Greetings::sayHelloWorld();

greetings.php 在哪里

<?php

namespace HelloWorld;

use PHP_Timer;

class Greetings
{
    public static function sayHelloWorld()
    {
        $timer = new PHP_Timer();
        $timer . start();
        return 'Hello World\n' . $timer->resourceUsage() . "\n";
    }
}

当我运行测试时php tests/test.php 它给了我一个错误:

PHP Fatal error:  Uncaught Error: Class 'PHP_Timer' not found in composer_php_hello_world_log4php/src/HelloWorld/Greetings.php:11
Stack trace:
#0 composer_php_hello_world_log4php/tests/test.php(8): HelloWorld\Greetings::sayHelloWorld()
#1 {main}
  thrown in composer_php_hello_world_log4php/src/HelloWorld/Greetings.php on line 11

Fatal error: Uncaught Error: Class 'PHP_Timer' not found in composer_php_hello_world_log4php/src/HelloWorld/Greetings.php:11
Stack trace:
#0 composer_php_hello_world_log4php/tests/test.php(8): HelloWorld\Greetings::sayHelloWorld()
#1 {main}
  thrown in composer_php_hello_world_log4php/src/HelloWorld/Greetings.php on line 11

我猜 composer.json 有问题:

"classname": {
      "PHP_Timer": "src/"
    }

PHP版本:

$ php --version
PHP 7.3.9 (cli) (built: Sep 14 2019 18:07:55) ( NTS )

链接到我的test repo

更新

这是我的文件autoload_namespaces.php

<?php

// autoload_namespaces.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'HelloWorld' => array($baseDir . '/src'),
);

还有autoload_classmap.php:

<?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'SebastianBergmann\\Timer\\Exception' => $vendorDir . '/phpunit/php-timer/src/Exception.php',
    'SebastianBergmann\\Timer\\RuntimeException' => $vendorDir . '/phpunit/php-timer/src/RuntimeException.php',
    'SebastianBergmann\\Timer\\Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php',
);

【问题讨论】:

  • 在安装/更新期间,所有 PSR-0 引用都被合并到一个 key =&gt; value 数组中。你检查过生成的文件vendor/composer/autoload_namespaces.php.
  • @lovelace 我在上面添加了文件vendor/composer/autoload_namespaces.php 内容
  • classname is not a valid composer.json 键。也许你的意思是classmap
  • 您忘记了use 声明。它发生了,没什么大不了的。

标签: php composer-php


【解决方案1】:

您没有加载正确的namespace。我建议你在包裹页面上查看examples

【讨论】:

    【解决方案2】:

    我认为你的composer.json 不需要这个:

    "classname": {
      "PHP_Timer": "src/"
    }
    

    根据https://github.com/sebastianbergmann/php-timer/blob/master/src/Timer.php你需要

    use SebastianBergmann\Timer\Timer as PHP_Timer;
    

    在您的 greetings.php 文件中。

    【讨论】:

      【解决方案3】:

      Greetings 类中缺少 use 语句:

      <?php
      
      namespace HelloWorld;
      
      use SebastianBergmann\Timer\Timer;
      
      class Greetings
      {
          public static function sayHelloWorld()
          {
              $timer = new Timer();
              $timer::start();
              return 'Hello World\n' . $timer->resourceUsage() . "\n";
          }
      }
      

      这可以从composer.json中删除:

          "classname": {
            "PHP_Timer": "src/"
           }
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 2018-04-13
      • 2018-04-05
      • 2016-01-17
      • 2021-11-13
      • 2017-09-25
      • 2021-03-03
      相关资源
      最近更新 更多