Как мне создать динамический метод в PHP? - PullRequest
1 голос
/ 29 марта 2010

Я пытаюсь расширить свой класс ActiveRecord с помощью некоторых динамических методов. Я хотел бы иметь возможность запустить это с моего контроллера

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

Я немного прочитал о перегрузке и думаю, что это ключ. У меня static $_attributes в моем классе AR, и я получаю имя таблицы, в данном случае используя множественное число моей модели (User = users).

Как мне это сделать? Все модели расширяют класс ActiveRecord.

Ответы [ 2 ]

2 голосов
/ 29 марта 2010

Вы должны использовать магический метод __ callStatic () , который доступен как PHP5.3

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
*/
}
0 голосов
/ 16 марта 2012

Это также может быть полезно, оно более сложное, но оно допускает истинные динамические функции с доступом к переменным-членам.

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");
};
...