但是,作曲家在相同的文件夹中自动加载相同的基类。
我的错误: 致命错误:在第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。
答案 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
。