带有路径的PHP实例对象
我正在尝试创建一个对象实例,其路径如下(C:\wamp\www…) 在一个新项目中,我有这个方法,我尝试用它来实例另一个项目的一个对象带有路径的PHP实例对象,php,object,symfony,instance,Php,Object,Symfony,Instance,我正在尝试创建一个对象实例,其路径如下(C:\wamp\www…) 在一个新项目中,我有这个方法,我尝试用它来实例另一个项目的一个对象 public function getControllerObject($class) { $object = null; $class = realpath($class); $class = str_replace('.php','',$class); $object = new $class(); } 例如,变量
public function getControllerObject($class)
{
$object = null;
$class = realpath($class);
$class = str_replace('.php','',$class);
$object = new $class();
}
例如,变量$class具有以下值:
C:\wamp\www\myproject\projectBundle\Controller\DefaultController
但我得到了FatalErrorException:错误:类。未找到类
我已经试着放了2个反斜杠,但没有用
有什么想法吗?使用basename,而不是realpath:
$class = basename($class);
例如,它应该生成
DefaultController
使用basename,而不是realpath:
$class = basename($class);
例如,它应该生成
DefaultController
首先,您试图做的事情听起来像是一个可怕的想法!如果要从其他项目访问该类,则应将其(项目或文件)添加到依赖项中
你的问题是,你基本上做的是:
$object = new C:\wamp\www\myproject\projectBundle\Controller\DefaultController();
这显然不是你想要的。当您没有输入一个有效的路径时(我假设是这样),realpath将返回false,并且它也不会工作
您必须以某种方式确定路径的哪一部分是命名空间的一部分,而哪一部分不是命名空间的一部分。您还可以通过添加项目根来实现这一点,这意味着要从路径或名称空间本身中删除哪个部分,即要从路径中保留的部分(假设您遵循PSR-0的建议),这将为您留下您想要的内容(在str_replace()
apreg_replace()
或类似内容之后)
无论如何,解决问题的最干净的方法(除了添加依赖项外)是在应用程序中使用路径而不是硬编码路径。首先,你试图做的事情听起来是个可怕的主意!如果要从其他项目访问该类,则应将其(项目或文件)添加到依赖项中 你的问题是,你基本上做的是:
$object = new C:\wamp\www\myproject\projectBundle\Controller\DefaultController();
这显然不是你想要的。当您没有输入一个有效的路径时(我假设是这样),realpath将返回false,并且它也不会工作
您必须以某种方式确定路径的哪一部分是命名空间的一部分,而哪一部分不是命名空间的一部分。您还可以通过添加项目根来实现这一点,这意味着要从路径或名称空间本身中删除哪个部分,即要从路径中保留的部分(假设您遵循PSR-0的建议),这将为您留下您想要的内容(在str_replace()
apreg_replace()
或类似内容之后)
无论如何,解决问题的最干净的方法(除了添加依赖项外)是在应用程序中使用路径而不是硬编码路径。好的,但是类不在同一名称空间上。那么名称空间是什么,项目名称是什么?您可以使用
basename
和dirname
的组合来构建动态命名空间和类字符串。该类的命名空间为myproject\projectBundle\Controller。但是我的代码,例如,这个对象在一个单独的项目上,好的,但是这个类不在同一个命名空间上,那么你的命名空间是什么,项目名称?您可以使用basename
和dirname
的组合来构建动态命名空间和类字符串。该类的命名空间为myproject\projectBundle\Controller。但是我的代码,比如说,这个对象在一个单独的项目上。你是想创建一个自动加载程序还是别的什么,因为听起来就是这样。是的,我想得到一个bundle symfony2的所有控制器类。也许还有其他解决方案可以做到这一点。Symfony2自带自动加载器。不需要创建一个新的。用use
语句对它们进行注释,然后像$controller=new IndexController()那样创建它们代码>出现错误,因为您试图从路径C:\wamp\[…]\Controller\DefaultController
创建对象。PHP文件必须包含或由AutoLoad调用,如果您想访问它。考虑添加<代码>要求一次(RealPATH($class));<代码>语句添加到代码中,然后添加$object=new ClassName()代码>。你不能创建一个文件的实例,但是,你可以创建一个类定义的实例。你是想创建一个自动加载程序还是别的什么,因为听起来就是这样。是的,我想得到一个bundle symfony2的所有控制器类。也许还有其他解决方案可以做到这一点。Symfony2自带自动加载器。不需要创建一个新的。用use
语句对它们进行注释,然后像$controller=new IndexController()那样创建它们代码>出现错误,因为您试图从路径C:\wamp\[…]\Controller\DefaultController
创建对象。PHP文件必须包含或由AutoLoad调用,如果您想访问它。考虑添加<代码>要求一次(RealPATH($class));<代码>语句添加到代码中,然后添加$object=new ClassName()代码>。不能创建文件的实例,但是可以创建类定义的实例