На этом шаге мы рассмотрим различные способы вызова методов.
Существуют две синтаксические формы вызова как методов класса, так и методов объекта.
Первая форма имеет вид:
method class_or_pbject, parameters
$somebody = new Staff, {"имя "=>"Анна"}; # метод класса showdata $somebody, "имя","фамилия"; # метод объекта showdata {"имя"=>"Мария","возраст"=>18}; # метод объекта showdata new Staff "возраст"; # метод объекта showdata setdata new Staff, {"имя"=>"Глеб"}, "имя"; # метод объекта
Данная форма представляет собой обычный вызов функции, который может быть вложенным в другой вызов. Первым аргументом функции является ссылка (для методов объекта) или имя пакета (для методов класса).
В приведенном примере первая строка содержит вызов конструктора new, в котором первым (и единственным) аргументом является имя пакета.
Вторая строка содержит вызов метода объекта, в котором первым аргументом является объект-ссылка.
В третьей строке первый аргумент задается при помощи блока {}, возвращающего ссылку на анонимный хеш-массив. Данный хеш-массив не будет объектом, так как он не объявлен объектом класса Staff при помощи функции bless(), но синтаксически такая конструкция возможна.
В четвертой строке метод объекта вызывается с двумя аргументами. Первым аргументом является ссылка, возвращаемая конструктором new(), вторым - строка "возраст".
В пятой строке конструктор new создает объект, который передается в качестве первого аргумента методу setdata. Вторым аргументом метода setdata является ссылка на анонимный хеш-массив {"имя"=>"глеб"}. Метод showdata в качестве первого аргумента использует ссылку, возвращаемую методом setdata, а в качестве второго аргумента - строку "имя".
Вторая форма обращения к методу имеет вид
class_or_object -> method(parameters)
Например, предыдущие вызовы могут быть записаны также в виде:
$somebody = Staff->new({"имя"=>"Анна"}); $somebody->showdata("имя","фамилия"); new Staff->showdata("возраст"); new Staff->setdata({"имя"=>"Глеб"})->showdata("имя");
Вторая форма требует обязательного заключения аргументов в скобки.
При использовании первой формы на том месте, где должен стоять объект или имя класса, синтаксис позволяет использовать либо имя класса, либо скалярную переменную, содержащую ссылку, либо блок {...}, возвращающий значение ссылки. Вторая форма для представления объекта позволяет использовать более сложные конструкции, например, элемент хеш-массива:
$obj->{keyname}->method().
Для того чтобы вызвать метод определенного класса, следует перед именем метода указать имя пакета, как при вызове обычной подпрограммы. Например, чтобы вызвать метод, определенный в пакете Staff, следует использовать запись вида:
$someone = new Staff; Staff::showdata($someone, "имя");
В данном случае просто вызывается метод showdata из пакета Staff. Ему передается в качестве аргумента объект $someone и прочие аргументы. Если вызвать метод следующим образом:
$someone=new Staff; $someone->Staff::showdata("имя");
$someone->SUPER::showdata("имя");
Такая запись имеет смысл только внутри пакета, являющегося классом.
На следующем шаге мы рассмотрим деструкторы.