Php 如果我可以动态访问类的代码,我可以创建类的对象吗?

Php 如果我可以动态访问类的代码,我可以创建类的对象吗?,php,class,Php,Class,这有点奇怪,但我想创建一个存储在另一个文件中的类的对象,我有文件的路径,但没有类的名称。 这种情况是,一个目录中存储了许多文件,每个文件只包含一个类。在这个目录之外是另一个文件,我正在其中开发一个函数,该函数取文件名,访问该文件并从中提取代码,然后在该文件中创建该类的对象并返回该对象。 我确信这是可能的,但无法使它发挥作用。 有人能帮我吗?你可以用 例如: 你可以用 例如: 这很简单,但不是很安全 1.将源文件作为文本加载,并与regexp的内容匹配,该regexp将以$classname返回类

这有点奇怪,但我想创建一个存储在另一个文件中的类的对象,我有文件的路径,但没有类的名称。 这种情况是,一个目录中存储了许多文件,每个文件只包含一个类。在这个目录之外是另一个文件,我正在其中开发一个函数,该函数取文件名,访问该文件并从中提取代码,然后在该文件中创建该类的对象并返回该对象。 我确信这是可能的,但无法使它发挥作用。 有人能帮我吗?

你可以用

例如:

你可以用

例如:


这很简单,但不是很安全

1.将源文件作为文本加载,并与regexp的内容匹配,该regexp将以$classname返回类的名称

2.根据源代码文本进行任何检查,以确保在“加载过程”中需要此类,例如提取构造函数参数

  • 只需要_一次('the_file.php'))

  • $my_new_instance=new$classname()(假定您没有构造函数参数)或$my_new_instance=new$classname($param1,$param2),假定您已从源代码分析阶段提取参数$param1,$param2


  • 这很简单,但不是很安全

    1.将源文件作为文本加载,并与regexp的内容匹配,该regexp将以$classname返回类的名称

    2.根据源代码文本进行任何检查,以确保在“加载过程”中需要此类,例如提取构造函数参数

  • 只需要_一次('the_file.php'))

  • $my_new_instance=new$classname()(假定您没有构造函数参数)或$my_new_instance=new$classname($param1,$param2),假定您已从源代码分析阶段提取参数$param1,$param2

  • 使用以下方法比较包含文件之前和之后的结果:

    使用以下方法比较包含文件前后的结果:



    将类文件名保存为类的名称是一种好的做法。。。你没那么做吗?这不足以解决你的问题吗?嗯。。好的,假设类名和文件名是相同的,那么您会怎么做呢?将类文件名保存为类的名称是一种很好的做法。。。你没那么做吗?这不足以解决你的问题吗?嗯。。好的,假设类名和文件名相同,那么您将如何做到这一点?删除downvote,转换为upvote。作为一个有经验的SO用户,特别是回复用户的第一篇帖子,因此树立了一个榜样,我发现这个链接只给出了答案,没有任何解释,这有点令人失望。这个解决方案很好,希望OP在每个文件中只存储一个类…删除downvote,转换为upvote。作为一个有经验的SO用户,特别是回复用户的第一篇帖子,因此树立了一个榜样,我发现这个链接只给出了答案,没有任何解释,这有点令人失望。这个解决方案很好,希望OP在每个文件中只存储一个类…如果OP在每个文件中有多个类(无论出于何种原因),这将找到所有类。回答得好。实际上我需要多次实例化同一个类,这个函数每次都创建一个正确类的对象吗?它为包含的文件中定义的每个类创建一个实例。如果文件中只有一个类,它将在变量
    $class1
    中创建一个实例。如果需要为现有对象创建新的类实例,可以使用来获取类的名称。例如,你可以做
    $className=get\u class($class1)$newInstance=new$className。或者,如果您100%确定包含的文件中只有一个类,您可以将
    放入
    循环,只需执行
    $var=new$newClasses[0]如果OP在每个文件中有多个类(无论出于何种原因),这将找到所有类。回答得好。实际上我需要多次实例化同一个类,这个函数每次都创建一个正确类的对象吗?它为包含的文件中定义的每个类创建一个实例。如果文件中只有一个类,它将在变量
    $class1
    中创建一个实例。如果需要为现有对象创建新的类实例,可以使用来获取类的名称。例如,你可以做
    $className=get\u class($class1)$newInstance=new$className。或者,如果您100%确定包含的文件中只有一个类,您可以将
    放入
    循环,只需执行
    $var=new$newClasses[0]是的,这里的regexp解决方案非常脏,我会删除它。regexp解决方案允许在不必要的情况下不包含不需要的文件,或者可能导致类重新定义。但我同意,这是一种非常糟糕的做法。它真的非常脏、慢(以文本形式加载整个文件,用regex解析),而且不可靠,另外,你还没有提供正则表达式,这是另一个争论点。因为它的问题是“我不知道文件中的代码”,我不能为他的特定用例提供正则表达式-没有,或者如果有,它的优点是有争议的。是的,这里的正则表达式解决方案非常脏,我会删除它。如果没有必要,regexp解决方案允许不包含不需要的文件,或者可能导致类重新定义。但我同意,这是一种非常糟糕的做法。它非常脏、缓慢(将整个文件加载为文本,使用regex解析),而且不可靠,而且您还没有提供regex,这是另一个争论点。因为它的问题是“我不知道文件中的代码”,我不能确切地为他的特定用例提供正则表达式-没有,或者如果有,它的优点是有争议的。
    
    $klass = end(get_declared_classes());
    $obj = new $klass;
    
    <?php
    
      $before = get_declared_classes();
      include_once('path/to/file');
      $after = get_declared_classes();
    
      $newClasses = array_diff($after, $before);
    
      for ($i = 0; isset($newClasses[$i]); $i++) {
        ${'class'.$i} = new $newClasses[$i];
        echo "New class $newClasses[$i] instantiated in variable \$class$i\n";
      }