动态加载PHP类


Dynamically load PHP class(es)

我见过无数关于如何创建动态命名类的例子,但它似乎对我不起作用:

$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