Как я могу сделать свой класс проверки расширяемым? - PullRequest
2 голосов
/ 09 декабря 2011

Я пишу класс проверки в PHP, который я хотел бы расширить без редактирования основного родительского класса. Ниже я предоставил упрощенную версию того, чего я надеюсь достичь. Я передаю имя функции / метода в validate (), который сначала проверяет, существует ли оно и вызывает ли оно, чтобы проверить, что переданная мною переменная действительна. Я новичок в ООП и у меня проблемы с областью видимости, поскольку я не могу получить какие-либо пользовательские правила проверки в дочернем классе, работающие без жесткого кодирования имени дочернего класса в родительском классе. Каков наилучший способ сделать это? Большое спасибо за любую помощь, которую вы можете предоставить.

$rule = "number";
$var = "abcdef";

class  Validation
{
    public static function validate($rule, $var) {
        if (is_callable("self::{$rule}")) {
            return self::$rule($var);
        }
    }

    protected static function number($var) {
        return (preg_match("/^[0-9]+$/i", $var));
    }
}

class MyRules extends Validation
{   
    public static function letter($var) {       
        return (preg_match("/^[a-zA-Z]+$/i", $var));
    }
}

print MyRules::validate($rule, $var) ? "Valid!" : "Not valid!"; // Not valid!

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Во-первых, вы можете предотвратить переопределение метода validate с помощью ключевого слова final:

public static final function validate($rule, $var) {

Что касается невозможности вызова статических методов подклассов, это можно сделать с помощью Позднее статическое связывание :

class Validation {
    public static final function validate($rule, $var) {
        if (is_callable("static::$rule")) {
            return static::$rule($var);
        }
    }
}
0 голосов
/ 09 декабря 2011

Вот как я работаю со своими самостоятельно созданными фреймворками / библиотеками:

Как и в большинстве n-уровневых систем (например, MVC), данные должны быть проверены, b4 они передаются на внутренний уровень (в базу данных) ... так что в архитектуре mvc вы можете создать модель, которая является стержневым для таблицы базы данных, помещает туда соединение и проверку запросов ... Этот класс модели должен знать только об этих данных таблицы и ничего более ...

Если вы доберетесь до точки и увидите, что валидация доходит до какой-то рутины ... вы можете создать библиотеку ... Или вы с самого начала можете подумать, какие данные будут у вашего приложения ...

P.S. : поэтому для каждого типа данных в таблице запишите соответствующую проверку, если проверки повторяются, создайте библиотеку и вызовите метод проверки lib для базового типа данных db

0 голосов
/ 09 декабря 2011

Это звучит как работа для шаблона разработки стратегии .Он может быть использован, если вы хотите разные варианты алгоритма, в вашем случае проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...