Php 如果我可以动态访问类的代码,我可以创建类的对象吗?
这有点奇怪,但我想创建一个存储在另一个文件中的类的对象,我有文件的路径,但没有类的名称。 这种情况是,一个目录中存储了许多文件,每个文件只包含一个类。在这个目录之外是另一个文件,我正在其中开发一个函数,该函数取文件名,访问该文件并从中提取代码,然后在该文件中创建该类的对象并返回该对象。 我确信这是可能的,但无法使它发挥作用。 有人能帮我吗?你可以用 例如: 你可以用 例如:Php 如果我可以动态访问类的代码,我可以创建类的对象吗?,php,class,Php,Class,这有点奇怪,但我想创建一个存储在另一个文件中的类的对象,我有文件的路径,但没有类的名称。 这种情况是,一个目录中存储了许多文件,每个文件只包含一个类。在这个目录之外是另一个文件,我正在其中开发一个函数,该函数取文件名,访问该文件并从中提取代码,然后在该文件中创建该类的对象并返回该对象。 我确信这是可能的,但无法使它发挥作用。 有人能帮我吗?你可以用 例如: 你可以用 例如: 这很简单,但不是很安全 1.将源文件作为文本加载,并与regexp的内容匹配,该regexp将以$classname返回类
这很简单,但不是很安全 1.将源文件作为文本加载,并与regexp的内容匹配,该regexp将以$classname返回类的名称 2.根据源代码文本进行任何检查,以确保在“加载过程”中需要此类,例如提取构造函数参数
这很简单,但不是很安全 1.将源文件作为文本加载,并与regexp的内容匹配,该regexp将以$classname返回类的名称 2.根据源代码文本进行任何检查,以确保在“加载过程”中需要此类,例如提取构造函数参数
使用以下方法比较包含文件前后的结果:
将类文件名保存为类的名称是一种好的做法。。。你没那么做吗?这不足以解决你的问题吗?嗯。。好的,假设类名和文件名是相同的,那么您会怎么做呢?将类文件名保存为类的名称是一种很好的做法。。。你没那么做吗?这不足以解决你的问题吗?嗯。。好的,假设类名和文件名相同,那么您将如何做到这一点?删除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";
}