Методы доступа PHP5 позволяют вам ограничить доступ к членам класса. Это новая функция в PHP5, но она уже существует во многих объектно-ориентированных языках. С помощью методов доступа вы можете разработать надежное объектно-ориентированное приложение и создать повторно используемые объектные приложения. Ориентированная библиотека классов.
Подобно C++ и Java, PHP имеет три метода доступа: общедоступный, частный и защищенный. Для метода доступа к члену класса это может быть один из них. Если вы не укажете метод доступа, доступ будет по умолчанию. Метод является общедоступным. Вы также можете указать метод доступа для статических членов, поместив метод доступа перед ключевым словом static (например, public static).
Доступ к открытым членам возможен без ограничений. Любой код вне класса может читать и записывать общедоступные свойства. Вы можете вызвать общедоступный метод из любого места вашего скрипта. В предыдущих версиях PHP все методы и свойства были общедоступными, поэтому объекты выглядели как красиво структурированные массивы.
Видимые только внутри класса. Вы не можете изменить или прочитать значение. частного свойства вне метода класса, в котором оно находится. Аналогично, только методы внутри одного класса могут вызывать частный метод. Ни один из них не может наследовать частные члены родительского класса
. класс может получить доступ к закрытым членам. См. пример 6.8, метод Equals сравнивает два виджета. Оператор == сравнивает два виджета одного и того же класса. Object, но в этом примере каждый экземпляр объекта имеет уникальный идентификатор.
и цена. Обратите внимание,
как метод равенства обращается к частному свойству другого экземпляра виджета. И Java, и C допускают эту операцию.
классВиджет
{
личное $имя;
частная $цена;
частный $id
общедоступная функция __construct($name, $price);
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
//проверяет, одинаковы ли два виджета Проверяет, одинаковы ли два виджета
публичная функция равна ($ виджет)
{
return(($this->name == $widget->name)И
($this->цена == $widget->цена));
}
}
$w1 = новый виджет('Cog', 5.00);
$w2 = новый виджет('Cog', 5.00);
//ИСТИНА
);
если($w1->равно($w2))
{
print("w1 и w2 одинаковыn");
}
//ЛОЖЬ
если($w1->равно($w3))
{
print("w1 и w3 одинаковыn");
}
//FALSE, == включает в сравнение идентификатор
if($w1 == $w2) //не равны, поскольку идентификаторы разные
{
print("w1 и w2 одинаковыn");
}
?>
Если вы новичок в объектно-ориентированном программировании, вам может быть интересно, какова цель использования частных членов. Возможно, вы помните идеи инкапсуляции и связи, которые мы обсуждали в начале этой главы.
Они могут быть скрыты внутри класса без доступа к ним состороны
кода вне класса. Они также помогают добиться слабой связи. Если код вне структуры данных не может напрямую получить доступ к внутренним свойствам, то неявной связи не будет.
частные свойства по-прежнему могут использоваться внешним кодом. Решение состоит в том, чтобы использовать пару общедоступных методов: один — get (получить значение свойства), другой — установить (установить значение свойства). Конструкторы также принимают свойства. начальное значение. Это позволяет осуществлять связь между членами через узкий, квалифицированный интерфейс. Это также дает возможность изменить значение, передаваемое методу. Обратите внимание, что в примере 6.8 конструктор заставляет цену быть числом с плавающей запятой (floadval(). )).
Доступ к защищенным членам возможен для всех методов в том же классе и в унаследованных классах. Публичные свойства нарушают дух инкапсуляции, поскольку позволяют подклассам зависеть от. Запись определенного атрибута в защищенный метод не вызывает этой проблемы. при использовании защищенного метода необходимо четко понимать структуру его родительского класса.
Обратите внимание, что у Widget теперь есть защищенный метод getName. Если экземпляр Widget попытается вызвать защищенный метод, произойдет ошибка: $w1->getName(. ) генерирует ошибку. Но метод getName в подклассе Thing может вызвать этот защищенный метод. Конечно, чтобы доказать, что метод Widget::getName является защищенным, этот пример кажется слишком простым. В реальных ситуациях использование защищенных методов зависит от. понимание внутренней структуры объекта.
<?php
классВиджет
{
личное $имя;
частная $цена;
частный $id
общедоступная функция __construct($name, $price);
{
$this->name = $name;
$this->price = floatval($price);
$this->id = uniqid();
}
//проверяем, одинаковы ли два виджета
публичная функция равна ($ виджет)
{
return(($this->name == $widget->name)И
($this->цена == $widget->цена));
}
защищенная функция getName()
{
возврат ($ это-> имя);
}
}
Класс Thing расширяет виджет
{
частная $color
общедоступная функция setColor($color);
{
$this->color = $color;
}
Публичная функция getColor()
{
return ($this->color);
}
Публичная функция getName()
{
return(родитель::getName());
}
}
$w1 = новый виджет('Cog', 5.00);
$w2 = новая вещь('Cog', 5.00);
$w2->setColor('Yellow');
//ИСТИНА (все еще!) Результат по-прежнему верен
если($w1->равно($w2))
{
print("w1 и w2 одинаковыn");
}
//печатаем вывод Cog Cog
print($w2->getName());
?>
Подкласс может изменить способ доступа к методу, переопределив метод родительского класса. Однако, если вы переопределяете открытый член класса, он должен оставаться открытым в подклассе. член, он может оставаться защищенным или стать общедоступным. Закрытые члены по-прежнему будут видны только в текущем классе. Объявление члена с тем же именем, что и частный член родительского класса, просто создаст другой член в текущем классе. вы не можете переопределить закрытый член.
Ключевое слово Final — это еще один способ ограничить доступ к методам-членам. Подкласс не может переопределить метод, помеченный как Final в родительском классе. Ключевое слово Final не может использоваться для свойств.