2010-03-30 2 views
1

У меня есть класс проверки, который нуждается в улучшении. Если мне требуется некоторая выборочная проверка, мне нужно указать пользовательскую функцию. Он работает примерно так:Создать функции класса «на лету»?

  1. Контроллер сообщает, что требуется специальная функция проверки.
  2. Контроллер запускает проверку.
  3. --- Получает ненадежный здесь ---
  4. класс Validation создает новый экземпляр класса контроллера ....
  5. Validation класс работает контроллер-> custom_validation_function()
  6. Validation класс возвращает истина/ложь

Есть ли что-то, что я могу изменить, чтобы сделать что-то вроде этого?

$validation = new validation; 
// Insert rules here. 
$validation->function() = $this->function(); 

Делая это, я мог бы избавиться от этапа создания ненужного экземпляра класса.

ответ

6

Вам необходимо использовать Strategy Pattern. У вас есть класс Validator для каждой проверки, которую вы хотите сделать, а затем создайте экземпляр этого класса в классе потребления по мере необходимости. Затем делегируйте проверку на экземпляр проверки.

Посмотрите на how Zend Framework does для идеи.
Также см пример, приведенный в моем ответе на этот смежный вопрос:

+1

О, это тоже работает ... – SeanJA

1

PHP действительно не поддерживает monkeypatching, но вы можете создать либо подкласс, и использовать его как свой объект $validation (так я бы это сделал). Или вы можете найти способ использовать __call для этого: http://php.net/manual/en/language.oop5.overloading.php

1

чекаут делегатов example на phpclasses.com.

$processruns->add(function() { echo "hello"; }); 
$processruns->add(function() { echo "world"; }); 

Также this обсуждение могло бы помочь.

+0

Но можете ли вы назвать '$ this' от этих функций? – SeanJA

+1

@SeanJA: Не использовал его, но, я полагаю, вы можете назвать его как '$ processruns-> add (function() {$ this-> yourfunction();});' –

Смежные вопросы