[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вызов метода __call() и поиск элемента
Nuclear_x
Это файл 'class.minmax.php', в котором используется магическая функция __call() :

<?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 написал(а):
Фигня какая,нехорошие префиксы dry.gif biggrin.gif

if($arg[$i]<$value) $value=$arg[$i]

Спустя 9 часов, 38 минут, 18 секунд (22.11.2011 - 08:46) linker написал(а):
А зачем тут __call()? Почему нельзя определить публичные методы в классе
public function min() {}
public function max() {}
какие цели преследуете, используя магию в данном случае? А вообще, читать мануал всегда полезно. PHP уже имеет в своём арсенале функции min() и 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() для чего тогда использовать?) а про поиск мин и макс значения - это для примера, так что ездить на велосипеде тоже полезно, ведь скоро со встроеными функциями все позабудут про алгоритмы вообще...

Спустя 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)
{
die('Фатальная ошибка, ' . __CLASS__ . 'не реализует метод ' . $name);
}
...
$obj->method();
а все эти min(), max() и прочее, необходимо реализовывать в явном виде. Дойдёшь до серьёзных паттернов, вот тогда и __call() пригодится.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.