Строка, содержащая строку функции.Как отобразить в другом файле? - PullRequest
1 голос
/ 09 января 2012
$str = "$obj = new class(); $obj->getSomeFunction();"

Возможно ли это?Я пытаюсь разработать очень динамичную платформу для создания своего веб-сайта.

В любом случае, чтобы это работало?Из строки "echo $ str;"это сделает объект и запустит функцию?

Ответы [ 4 ]

2 голосов
/ 09 января 2012

Вместо передачи объекта в виде строки, просто создайте новый экземпляр вашего объекта. И как только вы включите файл ... Все переменные, объекты и т. Д. Существуют в файле, который включает этот файл.

Edit:

Вместо передачи класса в виде строки вы можете создавать классы динамически:

<?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 голос
/ 09 января 2012

Я нахожусь в процессе написания моей собственной инфраструктуры 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);
    }
1 голос
/ 09 января 2012

В PHP включенные файлы выполняются при вызове include() или require(). Они следуют правилам переменной области и даже позволяют вам возвращать результаты, как если бы include был функцией, подобной этой:

dynamicPlatform.php

<?php
$object = include('createObjAndDoStuff.php');
?>

createObjAndDoStuff.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;
    }
}
0 голосов
/ 09 января 2012

То, что вы ищете, это eval , но, хотя оно будет выполнять именно то, что вы просите, оно считается плохим решением и может привести к грязному коду.

Вы можете просто включить файлкоторый содержит код PHP, или вы можете сериализовать метаданные о выполняемых действиях, а затем проанализировать эти данные.

В зависимости от того, чего вы пытаетесь достичь, вас может заинтересовать сериализация объектов в сеансе, а также в Шаблон команды (способ инкапсуляции набора операций в объект (ы))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...