我见过无数关于如何创建动态命名类的例子,但它似乎对我不起作用:
$dynamic_id = 980; // typically passed in
$class = 'API'Recipes'Mix_' . $dynamic_id;
$dyn_class = new $class();
// results in: Fatal error: Class 'API'Recipes'Mix_980' not found
$class = "API'Recipes'Mix_{$dynamic_id}";
$dyn_class = new $class();
// results in: Fatal error: Class 'API'Recipes'Mix_980' not found
$static_class = new API'Recipes'Mix_980();
// results in: Fatal error: Class 'API'Recipes'Mix_980' not found
我试图用一些基于$dynamic_id
值的动态加载类来实现一种策略模式。所有其他类都加载在此Slim Framework应用程序中。我只是在添加这些新类。
文件所在的路径包括在CCD_ 2中以自动加载&我为尝试动态加载而创建的接口自动工作,但动态类没有。PHPStorm在文件或目录上没有给我任何错误。
如果我只是手动加载PHPStorm,它会找到该类的正确路径,但它仍然表示无法加载该类,并出现致命错误,表示该类不存在。目前,我试图加载的类的全部内容是:
<?php
namespace API'Recipes;
class Mix_980
{
function __construct()
{
echo 'show me the money';
}
}
我从来没有看过"给我看看钱"&只得到一个PHP致命错误。我怀疑这与命名空间有关,但它是如此基本,应该可以工作。我试着将Recipes作为Recipe的子目录,重命名它,等等。似乎什么都不起作用!:(
<?php
namespace API'Recipe;
use API'Recipes'Mix_980;
class Mix implements MixInterface
{
private $mixType;
function __construct($item_type_id = 0)
{
//$class = "'API'Recipes'Mix_{$item_type_id}";
//$class = 'API'Recipes'Mix_' . $item_type_id;
//$class = new Mix_980();
//$class = ''API'Recipes'Mix_980';
//echo $class;
$mix = new 'API'Recipes'Mix_980();
}
}
目录结构:
B$ tree ./src/API/
./src/API/
├── Dir1
├── Dir2
├── . . .
├── Recipe
│ ├── MixInterface.php
│ ├── Mix.php // implements MixInterface
│ └── Recipe.php
├── Recipes
│ ├── Mix_123.php
│ ├── Mix_###.php
│ └── Mix_980.php
├── . . .
└── Dir9
composer.json
内容:
{
"require": {
"slim/slim": "2.6.2",
"php": ">=5.4.0"
},
"autoload": {
"psr-0": {
"API": "src/"
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
我的系统规格是:
B$ cat /etc/centos-release
CentOS release 6.6 (Final)
B$ php -v
PHP 5.5.32 (cli) (built: Feb 2 2016 16:21:18)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
更改此行:
$class = 'API'Recipes'Mix_' . $dynamic_id;
有了这个:
$class = ''API'Recipes'Mix_' . $dynamic_id;
顺便说一句,我注意到了;这也可能是错误的:
<?php
namespace API'Recipe;
use API'Recipes'Mix_980;
class Mix implements MixInterface
正确方式:
<?php
namespace API'Recipes;
use API'Recipes'Mix_980;
class Mix implements MixInterface