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

时间:2012-01-08 22:27:34

标签: php string function include

$str = "$obj = new class(); $obj->getSomeFunction();"

这可能吗?我正在尝试开发一个非常动态的平台,以使我的网站脱颖而出。

无论如何要让这个工作?来自“echo $ str;”的字符串它会生成对象并运行函数吗?

4 个答案:

答案 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感兴趣(一种在对象中封装操作集的方法)