You have an abstract class Parser:
class Parser {
…
function validateData($data, $type) {}
}
You need to override validateData() so that when $type is set it would call a custom user validator. For example, if $type == “Numeric”, validateData() would call validateNumeric($data) within itself.
Спустя 1 час, 48 минут, 46 секунд (22.06.2010 - 17:22) gzim9x написал(а):
как то так...
class Parser {
…
function validateData($data, $type) {}
}
class Parser2 extends Parser {
…
function validateData($data, $type) {
if ($type == "Numeric")
$this->validateNumeric($data);
}
function validateNumeric($data) {
...
}
}
Спустя 1 час, 20 минут, 56 секунд (22.06.2010 - 18:43) Mischanja написал(а):
пасиб. А можно ли через case($type) сделать все в одной функции, чтобы постоянно не дублировать несколько. Вот так вот можно, идея не теряет смысл?
class Parser {
…
function validateData($data, $type) {}
}
class Parser2 extends Parser {
…
function validateData($data, $type) {
switch ($type) {
case "Numeric":
$this->validateNumeric($data);
break;
case "String":
$this->validateNumeric($data);
break;
case "Array":
$this->validateNumeric($data);
break;
}
}
Спустя 3 минуты, 13 секунд (22.06.2010 - 18:46) Mischanja написал(а):
мля, и соответственно повводить несколько функций validateNumeric,validateArray, validateString. Я там промахнулся.
Спустя 24 минуты, 48 секунд (22.06.2010 - 19:11) gzim9x написал(а):
пасиб. А можно ли через case($type) сделать все в одной функции, чтобы постоянно не дублировать несколько. Вот так вот можно, идея не теряет смысл?
можно. Напишите как вам удобнее и чтобы удобнее читалось другим.
Написать код, чтобы его поняла машина может каждый, -- а вот чтобы разобрался другой программист...
Спустя 1 минута, 18 секунд (22.06.2010 - 19:12) Mischanja написал(а):
Спасибо.)
Спустя 41 минута, 37 секунд (22.06.2010 - 19:54) Ice написал(а):
странная какая-то задача, или составители ее: они пишут, что должен быть абстрактный класс Парсер, но в то же время приводят пример обычного класса.
Я думаю, что меня просят написать пример метода-перехватчика __get:
Я правильно понял?
Я думаю, что меня просят написать пример метода-перехватчика __get:
<?php
abstract class Parser {
abstract function validateData( $data, $type );
}
class Parser2 extends Parser {
function validateData( $data, $type ) {
$method = "validate{$type}";
if( method_exists( $this, $method ) ) {
return $this->$method( $data );
}
}
function validateNumeric( $data ) {
print 'ValidateNumeric: '.$data.'<br />';
}
function validateString( $data ) {
print 'ValidateString: '.$data.'<br />';
}
}
// запускаем
$p = new Parser2;
$p->validateData( 123, 'Numeric' ); // ValidateNumeric: 123
$p->validateString( 'Hello, world!', 'String' ) // ValidateString: Hello, world!
?>
Я правильно понял?
Спустя 54 минуты, 36 секунд (22.06.2010 - 20:48) Mischanja написал(а):
Да, так будет очень правильно! Вы поняли правильно.
Спустя 2 минуты, 27 секунд (22.06.2010 - 20:51) Ice написал(а):
Рад был помочь!
Спустя 32 минуты, 52 секунды (22.06.2010 - 21:23) Mischanja написал(а):
только у меня вопрос, зачем вот так вот писать:
return $this->$method( $data ); Разве нельзя просто return $this->$data ?
Не уловил этого момента(
return $this->$method( $data ); Разве нельзя просто return $this->$data ?
Не уловил этого момента(
Спустя 7 минут, 41 секунда (22.06.2010 - 21:31) Ice написал(а):
В данном случае вылезет ошибка, потому что свойство $data не определено в классе. Да и мы же хотим вызвать не просто свойство а валидатор для него, верно?
У нас же под $this->$method( $data ) скрывается валидатор для нашего параметра. Он и вернет всё приготовленным после обработки.
У нас же под $this->$method( $data ) скрывается валидатор для нашего параметра. Он и вернет всё приготовленным после обработки.
Спустя 2 минуты, 51 секунда (22.06.2010 - 21:34) Mischanja написал(а):
ох, ссории, я кое что не увидел, ведь мы передаем переменную через method. Ок, я все понял основательно, спасибо еще раз огромное!!!
Спустя 1 минута, 8 секунд (22.06.2010 - 21:35) Ice написал(а):
незачто