$str = "$obj = new class(); $obj->getSomeFunction();"
这可能吗?我正在尝试开发一个非常动态的平台来建立我的网站。
无论如何要让它工作?从"echo $str;"的字符串中,它将创建对象并运行函数?
与其将对象作为字符串传递,不如创建对象的新实例。一旦你包含一个文件..所有变量、对象等都存在于包含该文件的文件中。
编辑:
您可以动态创建类,而不是将类作为字符串传递:
<?php
class cc {
function __construct() {
echo 'hi!';
}
}
$type = 'cc';
$obj = new $type; // outputs "hi!"
?>
或者,您可以使用静态类:
<?php
class Foo {
public static function aStaticMethod() {
echo 'hi!';
}
}
Foo::aStaticMethod(); // outputs "hi!"
// or:
$classname = 'Foo';
$classname::aStaticMethod(); // outputs "hi!"
?>
我正在编写自己的 mvc 框架(作为一个学习项目(,需要动态创建对象并调用方法。我最终使用反射 api 来创建对象的新实例,然后调用该方法。在这种情况下,我最终传递了一个关联数组,该数组有两个键/值对、类名和我想调用的方法。我希望这有所帮助。
$class = $command['类']; $method = $command['方法'];
try{
$reflectorClass = new ReflectionClass($class);
$reflectedInstance = $reflectorClass->newInstance($matches);
} catch (Exception $e) {
exceptionHandler::catchException($e);
}
try {
$reflectorMethod = new ReflectionMethod($reflectedInstance, $method);
$reflectorMethod->invoke($reflectedInstance);
} catch (Exception $e) {
exceptionHandler::catchException($e);
}
在 PHP 中,当你调用 include()
或 require()
时,会执行包含的文件。它们遵循变量范围规则,甚至允许您返回结果,就好像包含是一个这样的函数一样:
动态平台.php
<?php
$object = include('createObjAndDoStuff.php');
?>
创建ObjAndDoStuff.php
<?php
$obj = new class();
$obj->getSomeFunction();
return $obj;
?>
正如@zerkms所指出的,你可能应该使用工厂。
class Factory {
public static function someclass() {
include_once('./classes/someclass.php'); //Although some discourage the use of *_once() functions
$obj = new someclass();
$obj->getSomeFunction();
return $obj;
}
}
//And to get a new class instance
$object = Singleton::someclass();
或有工厂的伪单例:
class SingletonFactory {
private static $someclass;
public static function someclass() {
if(!self::$someclass) {
include('./classes/someclass.php');
self::$someclass = new someclass();
self::$someclass->getSomeFunction();
}
return self::$someclass;
}
}
您正在搜索的是 eval 但虽然它会完全满足您的要求,但它被认为是糟糕的解决方案,并可能导致代码混乱。
您可以只包含包含 PHP 代码的文件,也可以序列化有关要执行的操作的元数据,然后解析该数据。
根据您要实现的目标,您可能对序列化会话中的对象以及命令模式(一种在对象中封装操作集的方法(感兴趣