包含函数行的字符串.如何在其他文件中回显


String containing function-line. How to echo in other file?

$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 代码的文件,也可以序列化有关要执行的操作的元数据,然后解析该数据。

根据您要实现的目标,您可能对序列化会话中的对象以及命令模式(一种在对象中封装操作集的方法(感兴趣