Composer自动加载不在父文件夹中加载基类

时间:2017-09-18 21:52:35

标签: php composer-php autoload

但是,作曲家在相同的文件夹中自动加载相同的基类。

我的错误: 致命错误:在第5行的C:\ VendorName \ www \ src \ ParentFolder \ Enums \ MyEnumeration.php中找不到类' VendorName \ ParentFolder \ Enums \ BasicEnum。

MyEnumeration.php:

<?php
  namespace VendorName\ParentFolder\Enums;


  abstract class MyEnumeration extends BasicEnum {
      const ConstantOne = 1;
      const ConstantTwo = 2;
      const ConstantThree = 3;
}

和BasicEnum.php:

<?php
namespace VendorName\ParentFolder;

abstract class BasicEnum {
    private static $constCacheArray = NULL;

    private function __construct() { }

    private static function getConstants() {
        if (self::$constCacheArray == NULL) {
            self::$constCacheArray = [];
        }
        $calledClass = get_called_class();
        if (!array_key_exists($calledClass, self::$constCacheArray)) {
            $reflect = new ReflectionClass($calledClass);
            self::$constCacheArray[$calledClass] = $reflect->getConstants();
        }
        return self::$constCacheArray[$calledClass];
    }

    public static function isValidName($name, $strict = false) {
        $constants = self::getConstants();

        if ($strict) {
            return array_key_exists($name, $constants);
        }

        $keys = array_map('strtolower', array_keys($constants));
        return in_array(strtolower($name), $keys);
    }

    public static function isValidValue($value, $strict = true) {
        $values = array_values(self::getConstants());
        return in_array($value, $values, $strict);
    }
}

我的文件夹结构:

+ VendorName
  + www
    + src
      + ParentFolder
        + Enums
              MyEnumeration.php
          BasicEnum2.php

并且,自动加载是通过以下方式构建的:

composer dump-autoload

使用composer.json:

{
    "autoload": {
        "psr-4": { "VendorName\\": "src/"}

    }
}

我的.php页面:

<h1>Composer Autoload Test</h1>
<p>Trying to load a class where base class is in parent folder.
<p>(Using the PHP.net BasicEnum example).
<br/>
<?php
    require __DIR__ . '/vendor/autoload.php';

    use VendorName\ParentFolder;
    use VendorName\ParentFolder\Enums;



    echo '<br/><br/>';
    if (class_exists('MyEnumeration')) {
        echo 'MyEnumeration exists';
    }
    else {
        echo 'MyEnumeration does NOT exist';   // This line prints out in browser.
    }
    echo '<br/><br/>';

    echo '<br/><br/>';
    if (class_exists('VendorName\ParentFolder\Enums\MyEnumeration')) {  // This line blows up because BaseEnum is not found in MyEnumeration.php.
        echo 'VendorName\ParentFolder\Enums\MyEnumeration exists';
    }
    else {
        echo 'VendorName\ParentFolder\Enums\MyEnumeration does NOT exist';
    }
    echo '<br/><br/>';


    echo '<br/><br/>';
    if (defined('VendorName\ParentFolder\Enums\MyEnumeration::ConstantOne')) {
        echo 'VendorName\ParentFolder\Enums\MyEnumeration::ConstantOne exists';
    }
    else {
        echo 'VendorName\ParentFolder\Enums\MyEnumeration::ConstantOne does NOT exist';
    }
    echo '<br/><br/>';  


    echo 'NotExist:' . (MyEnumeration::isValidName('NotExist') ? 'true' : 'false') . '<br/>';
    echo 'ConstantOne:' . (MyEnumeration::isValidName('ConstantOne') ? 'true' : 'false') . '<br/>';
    echo 'ConstantTwo:' . (MyEnumeration::isValidName('ConstantTwo') ? 'true' : 'false') . '<br/>';
    echo 'ConstantThree:' . (MyEnumeration::isValidName('ConstantThree') ? 'true' : 'false') . '<br/>';

?>

最后,我必须使用命名空间对MyEnumeration进行完全限定,否则即使我已经使用了'#En;'声明并使用composer autoload。

2 个答案:

答案 0 :(得分:0)

看起来你有
档案src\ParentFolder\Enums\BasicEnum2.php
在命名空间BasicEnum

中使用类VendorName\ParentFolder

但你必须有文件src\ParentFolder\Enums\BasicEnum.php(没有2)
在您的MyEnumeration.php脚本中,您必须使用此块:

use VendorName\ParentFolder\BasicEnum;

答案 1 :(得分:0)

您的MyEnumeration类位于命名空间VendorName\ParentFolder\Enums中。因此,它无法在上面的命名空间BasicEnum中找到\VendorName\ParentFolder作为符号。您可以在子类中完全指定它:

abstract class MyEnumeration extends \VendorName\ParentFolder\BasicEnum {

您还需要在BasicEnum中指明ReflectionClass的全局命名空间:

$reflect = new \ReflectionClass($calledClass);

另请注意,SQL Fiddle Demo使用use。您需要use特定的课程。例如,在您的php页面中,指定:

use VendorName\ParentFolder\Enums\MyEnumeration;

...允许在没有限定符的情况下使用MyEnumeration