$str = "$obj = new class(); $obj->getSomeFunction();"
这可能吗?我正在尝试开发一个非常动态的平台,以使我的网站脱颖而出。
无论如何要让这个工作?来自“echo $ str;”的字符串它会生成对象并运行函数吗?
答案 0 :(得分:2)
不是将对象作为字符串传递,而是创建对象的新实例。一旦你包含了一个文件..所有变量,对象等都存在于包含该文件的文件中。
编辑:
您可以动态创建类,而不是将类作为字符串传递:
<?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!"
?>
答案 1 :(得分:1)
在PHP中,当您致电include()
或require()
时,会执行包含的文件。它们遵循variable scope rules甚至允许您返回结果,就像包含的函数一样:
<强> dynamicPlatform.php 强>
<?php
$object = include('createObjAndDoStuff.php');
?>
<强> createObjAndDoStuff.php 强>
<?php
$obj = new class();
$obj->getSomeFunction();
return $obj;
?>
正如@zerkms指出的那样,你可能应该使用factories。
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;
}
}
答案 2 :(得分:1)
我正在编写自己的mvc框架(作为学习项目),需要动态创建对象并调用方法。我最终使用反射api来创建对象的新实例,然后调用该方法。在这种情况下,我最终传递了一个关联数组,该数组有两个键/值对,类名和我想调用的方法。我希望这有帮助。
$ class = $ command ['class']; $ method = $ command ['method'];
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);
}
答案 3 :(得分:0)
你要搜索的是eval,但它会完全符合你的要求,但它被认为是不好的解决方案,可能导致代码混乱。
您可以只包含包含PHP代码的文件,也可以序列化有关要执行的操作的元数据,然后解析该数据。
根据您要实现的目标,您可能对serializing objects in session以及Command Pattern感兴趣(一种在对象中封装操作集的方法)