PHP nasıl dinamik bir yöntem oluşturabilirim?

2 Cevap php

Bazı dinamik yöntemleri ile benim ActiveRecord sınıfı genişletmeye çalışıyorum. Benim denetleyicisi bu çalıştırmak edebilmek olmak istiyorum

$user = User::find_by_username(param);
$user = User::find_by_email(param);

Ben aşırı yükleme hakkında biraz okumak ve bu anahtar olduğunu düşünüyorum ettik. I'v benim AR sınıfta bir static $_attributes var ve ben bu durumda benim modeli (User =) kullanıcılar pluralizing tarafından tablo adı olsun.

Bunu nasıl yaparsınız? Tüm modeller ActiveRecord sınıfını genişletir.

2 Cevap

Sen PHP5.3 olarak kullanılabilir __callStatic() magic method, kullanmak zorunda

public static function __callStatic($name, $arguments) {
/*
    Use strpos to see if $name begins with 'find_by'
    If so, use strstr to get everything after 'find_by_'
    call_user_func_array to regular find method with found part and $arguments
    return result
*/
}

Bu da, kullanım, daha karmaşık, ama üye değişkenlerine erişim ile gerçek dinamik işlevleri sağlar olabilir.

class DynamicFunction {
    var $functionPointer;
    var $mv = "The Member Variable";

    function __construct() {
        $this->functionPointer = function($arg) {
            return sprintf("I am the default closure, argument is %s\n", $arg);
        };
    }

    function changeFunction($functionSource) {
        $functionSource = str_replace('$this', '$_this', $functionSource);
        $_this = clone $this;

        $f = '$this->functionPointer = function($arg) use ($_this) {' . PHP_EOL;
        $f.= $functionSource . PHP_EOL . "};";
        eval($f);
    }

    function __call($method, $args) {
        if ( $this->{$method} instanceof Closure ) {
            return call_user_func_array($this->{$method},$args);
        } else {
            throw new Exception("Invalid Function");
        }
    }
}

if (!empty($argc) && !strcmp(basename($argv[0]), basename(__FILE__))) {
    $dfstring1 = 'return sprintf("I am dynamic function 1, argument is %s, member variables is %s\n", $arg, $this->mv);';
    $dfstring2 = 'return sprintf("I am dynamic function 2, argument is %s, member variables is %s\n", $arg, $this->mv);';

    $df = new DynamicFunction();
    $df->changeFunction($dfstring1);
    echo $df->functionPointer("Rabbit");

    $df->changeFunction($dfstring2);
    $df->mv = "A different var";
    echo $df->functionPointer("Cow");
};