Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

24.2. Вызов методов пользователя классов

Функции работы с классами аналогичны элементарным функциям, и то, что они относятся классам, не делает их очень ужсложными, Изучение начнем со следующих функций:

• call_user_method(),

• call__user_method__array().

Функция call_user_method() позволяет вызывать метод пользователя определенного объекта. Помимо этого за счет введенных параметров можно, не прибегая НИ к каким манипуляциям, просто производить обращение ктой или иной функции (методу) имеющегося класса. Функция имеет следующий синтаксис:

mixed call_user_method(string method_name, object obj [, mixed parameter [, mixed... ] ])

Строка определяет имя метода обработки данных, т. е. имя функции класса, obj отвечает за определенный объект класса, parameter — параметр. Параметр может быть как и же удобнее использовать именно такой способ? Деловтом,что существуют ситуации, когда намного эффективнее будет использование функции, нежели последовательного обращения. Например, имея дело с «навороченными» классами, можно оценить все достоинства и недостатки.

Функция используется в РНР 3—3.0.3 и РНР 4 и выше.

Функция call_user_method() аналогична функции call_user_func(). Отличие их состоит в что первая производит обращение непосредственно к методу класса, а вторая — к самой функции. Поэтому мы сначала рассмотрели эти функции, хотя никакого прямого отношения к классам они не имеют.

Рассмотрим принцип работы функции call_user_method() на примере:

<?php

class Bus_stop {

    var $number;

    var $finish;

    function Bus_stop ($name, $stop) {

        $this->number = $name;

        $this->finish = $stop;

    }

    function check ($parameter="") {

        echo "Номер маршрута автобуса " , $this->number. " \n <br> ";

        echo "Порядковый номер автобуса " . $parametr.", конечная остановка которого ".$this->finish."\n<br>";

    }

}

$bus = new Bus_stop ("5", "ул.Одинцова") ;

echo "Непосредственный вызов\n* <br>";

$bus->check();

echo "\n*Косвенный вызов\n*<br>";

call_user_method("check", $bus, "1257");

?>

В этом скрипте создается класс Bas_stop(), который имеет свои методы. Первая функция класса позволяет указывать значения переменным, заданным при определении объекта. В нашем случае при помощи строки $bus=new Bus_stop ("5", "ул.Одинцова"); производится создание объекта с необходимыми для этого параметрами (5 — это номер маршрута нашего автобуса, ул. Одинцова — это конечная остановка, т. е. пункт, где происходит разворот автобуса). После этого имеющиеся значения передаются в класс. Далее, чтобы получить результаты работы класса Bas_stop, нам необходимо вызвать его. При этом рассмотрим функцию check отдельно:

function check($parametr="") {

    echo "Номер маршрута автобуса " . $this->number, " \n <br> ";

    echo "Порядковый номер автобуса " . $parametr. " , конечная остановка которого " . $this->finish."\n<br>";

}

Функция check() позволяет выводить результат с учетом введенных в класс значений. Именно при помощи этой функции мы сможем увидеть все отличия между непосредственным способом вызова и косвенным с описываемой нами функцией call_user_method(), Обратите внимание, при обращении к этой функции необходимо задавать значение, которое будет принимать переменная $parametr. Это будет сам номер автобуса, который ходит по маршруту номера 5. Сами ведь автобусы могут меняться, например один сломался, второй не завелся и т. д., поэтому и сам параметр тоже будет меняться. Способ вызоватакой функции класса Bus_stop может быть произведен двумя способами:

• непосредственный вызов;

• косвенный вызов.

Рассмотрим эти способы в порядке, в котором они представлены, с учетом нашего примера.

Непосредственный способ вызова заключается в элементарном обращении объекта к вызываемому методу (см. гл. 15). В нашем примере это выглядит следующим образом:

$bus->check();

Для задания параметра необходимо отобразить его значение при вызове функции. Мы тут это не делали, так как это элементарные шаги.

При косвенном вызове все происходит за счет использования функции call_user_method():

call_user_method("check", $bus, "1257");

Как видно из параметров функции check, имя функции, т. е. вызываемого метода, $bus — определенный ранее объект со всеми его параметрами, "1257" — именно эти параметры, которые непосредственно передаются функции и переменная $parametr принимает значение 1257, после чего ипроисходит манипуляция данным параметром и не только. Это можно увидеть, ознакомившись с результатом выполнения программы:

*Вызов непосредственно*

Номер маршрута 5

Порядковьм номер автобуса ..., конечная остановка которого ул. Одинцова

*Вызов косвенно*

Номер маршрута автобуса 5

Порядковьм номер автобуса 1257, конечная остановка которого ул. Одинцова

Обратите внимание, что в случае непосредственного вызова на месте, где стоит многоточие, должен быть указан номер 1257, но так как мы при обращении к данному методу check() не сделали этого, соответственно он не был принят. Во втором же случае все наоборот.

Если вам необходимо помимо одного параметра задать еще несколько, то для этого используется функциякосвенного вызова call_user_method_array(). Например, по маршруту с номером 5 ходит не один автобус, как было в первом случае, а несколько, предположим, с номерами 1257, 1267,1258,1278. В этом случае применить функцию call_user_method() невозможно, так как в функцию check() будем задавать уже не одно значение, а массив значений.

Функция call_user_method_array() используется в:

• РНР 4,

• CVS.

Функция была добавленак CVS после выпуска PHP 4.0.4pl1. Call_user_method_array() имеет следующий синтаксис:

mixed call_user_method_array(string method__name, object obj [, array paramarr])

Все параметры аналогичны параметрам call_user_method(), единственное отличие состоит в том, что paramarr принимает не одно значение, а массив значений. В этот массив запишем значения 1257,1267,1258,1278..

<?php

class Bus_stop {

    var $number;

    var $finish;

    function Bus_stop($name, $stop) {

        $this->number = $name;

        $this->finish = $stop;

    }

    function check($$parametr="", $parametr1="", $parametr2="", parametr3="") {

        echo "Номер маршрута автобуса ".$this->number." \n <br> ";

        echo "Порядковые номера автобусов на этом маршруте ".$parametr.", ".$parametr1.", ".$parametr2.", ".$parametr3.", конечная остановка ".$this->finish."\n<br>";

    }

}$bus = new Bus_stop("5","ул.Одинцова");

echo "*Непосредственный вызов\n* <br>";

$bus->check();

echo "\n*Косвенный вызов\n*<br>";

call_user_method_array("check", $bus, array(1257, 1267, 1258, 1278)) ;

?>

Результат программы

Непосредственный вызов*

Номер маршрута автобуса 5

Порядковые номера автобусов на этом маршруте,,,, конечная остановка ул. Одинцова

*Косвенный вызов*

Номер маршрута автобуса 5

Порядковые номера автобусов на этом маршруте 1257, 1267, 1258, 1278, конечная остановка ул. Одинцова

При непосредственном вызове в результате вывелось несколько запятых подряд, они появились за счеттого, что не были переданы значения переменной $parametr в функции check.

<< Предыдущий параграф Следующий параграф >>
Оглавление