0

我知道这实际上不是逆向工程

我有这个功能:

<?=$this->get('translator')->trans('dashboard.actions', array(), 'front');?>

我想了解如何插入在使用该代码时被调用的函数(可能使用包含)。

我知道函数名必须是trans,并且它有3 个参数,但是如何定义呢?让我用一种更简单的方式来说明:在 php 脚本中,我如何在使用时打印Hello world$this->get('translator')->trans('dashboard.actions', array(), 'front');

4

3 回答 3

0

这只是一个常规的类方法:

class Traslator{
    public function trans($a, $b, $c){
        return 'Hello world';
    }
}

现在,您只需要调用另一个get()返回前一个类的实例的类方法:

class Foo{
    public function get(){
        return new Traslator;
    }
}

完整代码:

<?php

class Traslator{
    public function trans($a, $b, $c){
        return 'Hello world';
    }
}

class Foo{
    public function get(){
        return new Traslator;
    }


    public function test(){
        ?>
        <?=$this->get('translator')->trans('dashboard.actions', array(), 'front');?>
        <?php
    }
}

$f = new Foo;
$f->test();
于 2013-06-10T16:22:29.050 回答
0

$this引用当前对象实例,并且该变量可能不会被重新分配。意思是,要欺骗 PHP 做你想做的事情,需要在你提到的行之前和之后添加代码。

通过创建单个类,可以获得结果。

<?=...行前

<?php
    class C {
        function get($s) {
            return $this;
        }
        function trans($s, $a, $f) {
            return 'Hello world';
        }
        function hw() {
?>

然后线

<?=$this->get('translator')->trans('dashboard.actions', array(), 'front');?>

然后需要,结束类,并调用你想要的方法

<?php
}}
    $i = new C();
    $i->hw();

将 3 块代码放入一个文件并在其上调用 PHP,该<?=...行应显示“Hello world”。

于 2013-06-10T16:25:38.403 回答
0

$this->get('translator')返回类的实例让我们称它为“翻译器” - 在那个实例上你调用trans()方法

所以您想将“翻译器”的实例更改为您的扩展版本

class ExtTranslator extends Translator{
    public function trans($params){
        echo 'fdsfds'; // here you could add what you like
        return parent::trans($params);
    }
}

是的-很难帮助您,因为我真的不知道您要做什么-要使用该代码,您必须首先了解它...

于 2013-06-10T16:27:32.530 回答