<?php
class Minmax
{
public function __call($method, $arg)
{
if (!is_array($arg)) return false;
//ПОИСК МАКСИМАЛЬНОГО И МИНИМАЛЬНОГО ЭЛЕМЕНТА В МАССИВЕ
$value=$arg[0];
if($method=='min')
{
for($i=0;$i<count($arg);$i++)
{
if($arg[i]<$value) $value=$arg[i];
}
}
if($method=='max')
{
for($i=0;$i<count($arg);$i++)
{
if($arg[i]>$value) $value=$arg[i];
}
}
return $value;
}
}
?>
Это программа 'use_call_method.php' в которой используется класс minmax
<?php
error_reporting( E_ALL & E_STRICT );
require_once('class.minmax.php');
$obj = new Minmax;
echo $obj->min(43,18,5,10,123,56,36);
echo "<br>";
echo $obj->max(43,18,5,10,123,56,36);
//вызываем метод min, но так как такого метода в классе нет, то вызывается //метод __call, и в зависимости от имени
//min или max - вызывается определенный алгоритм;
?>
При вызове метода min и max, которые не определены в класе, срабатывает функция __call(), в которой описаны алгоритмы поиска максимального и минимального элемента массива. Результатом работы программы является число одно 43 - т.е. первый элемент массива. Почему так происходит не пойму. Подскажите пожалуйста. Заранее спасибо.
Спустя 6 минут, 22 секунды (21.11.2011 - 23:08) bodja написал(а):
Фигня какая,нехорошие префиксы
if($arg[$i]<$value) $value=$arg[$i]
if($arg[$i]<$value) $value=$arg[$i]
Спустя 9 часов, 38 минут, 18 секунд (22.11.2011 - 08:46) linker написал(а):
А зачем тут __call()? Почему нельзя определить публичные методы в классе
public function min() {}какие цели преследуете, используя магию в данном случае? А вообще, читать мануал всегда полезно. PHP уже имеет в своём арсенале функции min() и max().
public function max() {}
echo min(array(4, 23, 5, 1, 0, 7, 8));т.е. велосипед по поиску минимума и максимума у вас явно лишний.
echo max(array(4, 23, 5, 1, 0, 7, 8));
// можно так
echo min(4, 23, 5, 1, 0, 7, 8);
echo max(4, 23, 5, 1, 0, 7, 8);
Спустя 6 дней, 13 часов, 34 минуты, 23 секунды (28.11.2011 - 22:20) Nuclear_x написал(а):
1) Спасибо bodja!
2) linker, а метод __call() для чего тогда использовать?) а про поиск мин и макс значения - это для примера, так что ездить на велосипеде тоже полезно, ведь скоро со встроеными функциями все позабудут про алгоритмы вообще...
2) linker, а метод __call() для чего тогда использовать?) а про поиск мин и макс значения - это для примера, так что ездить на велосипеде тоже полезно, ведь скоро со встроеными функциями все позабудут про алгоритмы вообще...
Спустя 1 день, 10 часов, 29 минут, 38 секунд (30.11.2011 - 08:50) linker написал(а):
Метод __call() в твоём случае нужно использовать для такого
public function __call($name, $args)ну или так
{
throw new Exception('Класс ' . __CLASS__ . 'не реализует метод ' . $name);
}
...
$obj->method();
public function __call($name, $args)а все эти min(), max() и прочее, необходимо реализовывать в явном виде. Дойдёшь до серьёзных паттернов, вот тогда и __call() пригодится.
{
die('Фатальная ошибка, ' . __CLASS__ . 'не реализует метод ' . $name);
}
...
$obj->method();