簡體   English   中英

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

[英]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!"
?>

在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;
    }
}

我正在編寫自己的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);
    }

您正在搜索的是eval,但它會完全按照您的要求執行,但它被認為是錯誤的解決方案並且可能導致代碼混亂。

您可以只包含包含PHP代碼的文件,也可以序列化有關要執行的操作的元數據,然后解析該數據。

根據您要實現的目標,您可能有興趣在會話命令模式序列化對象 (一種在對象中封裝操作集的方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM