1

我在一个大类中工作,它是应用程序的骨干之一,我们称之为myClass. 我需要为这个类创建一个新的公共方法,并让它接受一个变量数组,该数组调用我正在编写的函数的各个方法:my_new_iterative_function()......从某种意义上说,我需要一个“类中的类” " (javascript 很适合这个 ;) ... 我怎样才能实现以下目标,我迭代$fallback_order参数数组以更改调用这些方法的顺序,然后有一个默认顺序,如果$fallback_order为 false则执行默认参数?

class myClass {
    public function existing_app_method_1() {
        // other code
    }
    public function existing_app_method_2() {
        // other code
    }
    // large app-centric class with many more methods

    public function my_new_iterative_function( array $fallback_order = false ) {
        method_foo() {
            // do stuff
        }
        method_bar() {
            // do stuff
        }
        method_more_methods() {
            // there are at least 5 of them in total
        }

        if ( $fallbackorder == false ):
            method_foo();
            method_bar();
        else:
            foreach ( $fallback_order as $index => $this_fallback ) {
                $name = $this_fallback;
                if ( $this_fallback == $name ):
                    $this->$name();
                endif;
            }
        endif;
    }
}

视图模板中的目标如下:

<div><?php $myClass->my_new_iterative_function( array( 'method_more_methods', 'method_bar', 'method_foo', ) ); ?></div>

编辑:修复了一些明显错误的逻辑

4

2 回答 2

3

您可以将方法作为匿名函数放在方法内的数组中,并使用输入索引这些数组,如下所示:

class Foo {
    private $stuff = 'tickle me elmo';        

    public function my_new_iterative_function(array $fallback_order = array('method_foo', 'method_bar')) {

        $self = $this; // this acts as a keyword, you can't use in the `use ()` part

        $order_functions = array(
            'method_foo' => function() use ($self) {
                print "im in foo: {$self->stuff}<br>";
            },
            'method_bar' => function(){
                print "im in bar<br>";
            },
        );

        foreach ( $fallback_order as $index => $this_fallback ) {
            $order_functions[$this_fallback]();
        }
    }
}
(new Foo)->my_new_iterative_function(); // look, one-line `new` and method call, since php 5.4
(new Foo)->my_new_iterative_function([ 'method_bar', 'method_foo', ]); // and even [] for array literals too!

我还在默认参数中嵌入了默认顺序。(当您将其作为数组输入时将其设置为 false 是一个致命错误)

于 2012-10-15T17:10:37.830 回答
1

我意识到你已经接受了一个很好的答案,我应该说我不太了解 PHP,但我想我可能会插话,因为我已经考虑了一点.

我想知道将您迭代的方法中的逻辑抽象为单独的命令是否会更整洁(具有明显的优势,您可以在不触及迭代代码的情况下添加更多方法,并且您将最小化添加到您的额外代码的数量大班)。然后,您可以将默认顺序数组设置为的属性,myClass但如果需要,可以在my_new_iterative_function方法的参数中覆盖它(或者,可能更好,通过 setter on myClass)。

原谅代码,但像这样:

class myClass 
{

    // override default order via class setter if required
    protected $fallback_order = array(new FooCommand(), new BarCommand(), new ANOtherCommand());

    public function my_new_iterative_function(  ) {

            foreach ( $this -> fallback_order as $value ) {
                $value -> execute();
            }
    }
}

或者可能是这样的:

class MyClass 
{

    // override default order in method invokation if required
    protected $default_fallback_order = array(new FooCommand(), new BarCommand(), new ANOtherCommand());

    public function my_new_iterative_function( $fallback_order = null ) {

            // Use default fallback order if an override has not been 
            // specified in method parameter
            if (is_null($fallback_order))
                $fallback_order = $this -> default_fallback_order;

            foreach ( $fallback_order as $value ) {
                $value -> execute();
            }
    }
}

$myClass = new MyClass();
$myClass -> my_new_iterative_function(); // use default fallback order
$myClass -> my_new_iterative_function(array(new ANOtherCommand(), new BarCommand(), new FooCommand()));
于 2012-10-16T00:28:18.907 回答