Latest News : 亮瞎双眼的那些年!

php替换部分class操作方法

乱弹 admin 113 views 0 comments
$objPatch = new Patch(ABSPATH . 'wp-content/plugins/a-plugin/code.php');
$objPatch->renameClass("Patched_AClass", "Patched_Patched_AClass"); // just to avoid class redefinition
$objPatch->redefineFunction("
    function default_initialize() {
        echo 'my patched function';
    }");
eval($objPatch->getCode());
$result = new Patched_AClass();
class Patch {

    private $_code;

    public function __construct($include_file = null) {
        if ( $include_file ) {
            $this->includeCode($include_file);
        }
    }

    public function setCode($code) {
        $this->_code = $code;
    }

    public function includeCode($path) {

        $fp = fopen($path,'r');
        $contents = fread($fp, filesize($path));
        $contents = str_replace('<?php','',$contents);
        $contents = str_replace('?>','',$contents);
        fclose($fp);        

        $this->setCode($contents);
    }

    function redefineFunction($new_function) {

        preg_match('/function ([^\(]*)\(/', $new_function, $aryMatches);
        $func_name = trim($aryMatches[1]);

        // capture the function with its body and replace it with the new function
        if ( preg_match('/((private|protected|public)?\s?function ' . $func_name .'[\w\W\n]+?)(private|protected|public|function|class)/s', $this->_code, $aryMatches) ) {

            $search_code = $aryMatches[1];

            $new_code = str_replace($search_code, $new_function."\n\n", $this->_code);

            $this->setCode($new_code);

            return true;

        } else {

            return false;

        }

    }
    function renameClass($old_name, $new_name) {

        $new_code = str_replace("class $old_name ", "class $new_name ", $this->_code);

        $this->setCode($new_code);

    }

    function getCode() {
        return $this->_code;
    }
}

 

 

Please indicate: 无趣的人生也产生有意思的事件 » php替换部分class操作方法

Hi, you must log in to comment !