Объекты PHP5 были скорректированы более систематически и комплексно, и их текущий внешний вид может быть чем-то похож на Java. В этом разделе основное внимание уделяется новому объектному режиму в PHP5 и приводятся несколько более простых примеров для иллюстрации. Пусть этот раздел станет новой отправной точкой вашего путешествия по PHP5. :)
* Конструктор и деструктор
* Ссылка на объект
*Клон объекта
* Приватный, публичный и защищенный режимы в объектах
* Интерфейсы
* Абстрактный класс
* __вызов
* __set и __get
* Статические участники
Конструктор и деструктор.
В PHP4, когда функция имеет то же имя, что и объект, эта функция становится конструктором объекта, а в PHP4 нет понятия деструктора.
В PHP5 конструктор имеет единое имя __construct, а также введено понятие деструктора, который носит единообразное имя __destruct.
Пример 1: Конструктор и деструктор
класс фу {
вар $х;
функция __construct($x) {
$это->х = $х;
}
отображение функции() {
печать ($ это-> х);
}
функция __destruct() {
print("Пока-пока");
}
}
$o1 = новый foo(4);
$o1->дисплей();
?>
В приведенном выше примере, когда вы завершаете вызов класса foo, будет вызван его деструктор, и в приведенном выше примере будет выведено «пока-пока».
ссылки на объекты
в PHP4 передача переменной функции или методу фактически создает копию переменной, а это означает, что то, что вы передаете функции или методу, является копией переменной, если только вы не используете ссылку. Символ «&» используется для обозначения того, что должна быть сделана ссылка, а не копия. В PHP5 объекты всегда существуют в виде ссылок, а операции присваивания в объектах также являются ссылочными операциями.
Пример 2: Ссылка на объект
класс фу {
вар $х;
функция setX($x) {
$это->х = $х;
}
функция getX() {
верните $this->x;
}
}
$o1 = новый foo;
$o1->setX(4);
$о2 = $о1;
$o1->setX(5);
if($o1->getX() == $o2->getX()) print("О боже мой!");
?>
Клон объекта
Как упоминалось выше, когда объект всегда вызывается в форме ссылки, что мне следует делать, если я хочу получить копию объекта? PHP5 предоставляет новую функцию клонирования объектов с синтаксисом __clone.
Пример 3: Клонирование объектов
класс фу {
вар $х;
функция setX($x) {
$это->х = $х;
}
функция getX() {
верните $this->x;
}
}
$o1 = новый foo;
$o1->setX(4);
$o2 = $o1->__clone();
$o1->setX(5); if($o1->getX() != $o2->getX()) print("Копии независимы");
?>
Методы клонирования объектов существуют во многих других языках приложений, поэтому вам не придется беспокоиться о их стабильности. :)
Приватный, публичный и защищенный режимы объектов
В PHP4 все методы и переменные объекта являются общедоступными, что означает, что вы можете работать с любыми переменными и методами вне объекта. PHP5 представляет три новых режима управления этим разрешением доступа: общедоступный, защищенный и частный.
Публичный режим (Public): позволяет управлять работой вне объекта.
Приватный режим (Частный): только методы внутри этого объекта могут работать с ним и контролировать его.
Защищенный режим (Защищенный): позволяет этому объекту и его родительскому объекту управлять им.
Пример 4: Частный, общедоступный и защищенный режимы в объектах
класс фу {
частный $x;
публичная функция public_foo() {
print("Я публичный");
}
защищенная функция protected_foo() {
$this->private_foo(); //Хорошо, поскольку мы находимся в одном классе, мы можем вызывать частные методы
print("Я защищен");
}
частная функция Private_foo() {
$это->х = 3;
print("Я конфиденциальный");
}
}
класс foo2 расширяет foo {
публичная функция display() {
$this->protected_foo();
$this->public_foo();
// $this->private_foo() // Недействительно! Функция является частной в базовом классе.
}
} $x = новый foo();
$x->public_foo();
//$x->protected_foo(); //Invalid не может вызывать защищенные методы вне класса и производных классов;
//$x->private_foo(); //Недопустимые частные методы можно использовать только внутри класса $x2 = new foo2();
$x2->дисплей();
?>
Совет: Переменные в объектах всегда существуют в частной форме. Непосредственное управление переменными в объекте не является хорошей привычкой объектно-ориентированного программирования. Лучше всего передать нужные переменные методу объекта для обработки.
Интерфейсы
Как мы все знаем, объекты в PHP4 поддерживают наследование. Чтобы сделать объект производным классом другого объекта, вам нужно использовать код, аналогичный «class foo расширяет родительский объект», для управления им. В PHP4 и PHP5 объект может быть унаследован только один раз, множественное наследование не поддерживается. Однако в PHP5 появился новый термин: интерфейс.Интерфейс — это специальный объект без специального кода обработки. Он определяет только имена и параметры некоторых методов. После этого объект можно удобно использовать с ключевым словом «implement». Необходимые интерфейсы интегрируются, а затем добавляется конкретный код выполнения.
Пример 5: Интерфейс
отображаемый интерфейс {
функция отображения();
}
интерфейс для печати {
функция допринт();
}
Класс foo реализует displayable,printable {
отображение функции() {
// код
} функция допринт() {
// код
}
}
?>
Это очень полезно для улучшения читаемости и популярности кода. Из приведенного выше примера мы видим, что объект foo содержит два интерфейса: отображаемый и печатаемый. На данный момент мы можем четко знать, что объект foo должен иметь отображение. () и метод print(), вам нужно только понять часть интерфейса, вы можете легко управлять объектом, не заботясь о том, как объект работает внутри.
Абстрактные классы
Абстрактные классы не могут быть созданы.
Абстрактные классы, как и другие классы, позволяют определять переменные и методы.
Абстрактный класс также может определять абстрактный метод. Метод абстрактного класса не будет выполнен, но он может быть выполнен в его производном классе.
Пример 6: Абстрактный класс
абстрактный класс foo {
защищенный $x;
абстрактная функция display();
функция setX($x) {
$это->х = $х;
}
}
класс foo2 расширяет foo {
отображение функции() {
// Код
}
}
?>
__call
PHP5 имеют новый специальный метод __call(), который используется для мониторинга других методов объекта. Если вы попытаетесь вызвать метод, которого нет в объекте, метод __call будет вызван автоматически.
Пример 7: __call
класс фу {
функция __call($name,$arguments) {
print("Ты мне звонил? Меня зовут $name!");
}
} $x = новый foo();
$x->doStuff();
$x->fancy_stuff();
?>
Этот специальный метод можно использовать для реализации действий «перегрузки», чтобы вы могли проверять свои параметры и передавать их, вызывая частный метод.
Пример 8. Использование __call для реализации действия «перегрузки»
класс Магия {
функция __call($name,$arguments) {
if($name=='foo') {
if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
}
} частная функция foo_for_int($x) {
print("о, int!");
} частная функция foo_for_string($x) {
print("о, строка!");
}
} $x = новая магия();
$х->фу(3);
$x->foo("3");
?>
__set и __get
Это отличный метод. Методы __set и __get можно использовать для захвата переменных и методов, которые не существуют в объекте.
Пример 9: __set и __get
класс фу {
функция __set($name,$val) {
print("Здравствуйте, вы пытались поместить $val в $name");
}
функция __get($name) {
print("Эй, ты спросил $name");
}
}
$x = новый foo();
$х->бар = 3;
печать ($x->winky_winky);
?>
Индикация типа
В PHP5 вы можете указать в методе объекта, что его параметр должен быть экземпляром другого объекта.
Пример 10: Индикация типа
класс фу {
// код...
}
класс бар {
публичная функцияprocess_a_foo(foo $foo) {
//Некоторый код
}
}
$b = новый бар();
$f = новый foo();
$b->process_a_foo($f);
?>
Как видно, мы можем явно указать имя объекта перед параметром, и PHP5 распознает, что параметр будет экземпляром объекта.
Статические члены
Статические члены и статические методы называются «методами объекта (методами класса)» и «переменными объекта (переменными класса)» в терминологии объектно-ориентированного программирования.
«Методы объекта» разрешено вызывать до создания экземпляра объекта. Аналогично, «переменными объекта» можно управлять независимо до создания экземпляра объекта (без использования методов объекта для управления им).
Пример 11: Методы объекта и переменные объекта
калькулятор классов {
статический общественный $pi = 3.14151692;
статическая публичная функция add($x,$y) {
вернуть $x + $y;
}
}
$s = калькулятор::$pi;
$result = калькулятор::add(3,7);
печать("$результат");
?>
Обработка исключений
Обработка исключений признана идеальным методом обработки ошибок программы. Эта концепция доступна в Java и C++. Мы рады видеть, что это приложение было добавлено в PHP5. Вы можете попробовать использовать «try» и «catch» для контроля ошибок программы.
Пример 12: Обработка исключений
класс фу {
функция деления($x,$y) {
if($y==0) throw new Exception("невозможно разделить на ноль");
вернуть $x/$y;
}
}
$x = новый foo();
пытаться {
$x-> разделить (3,0);
} catch (Исключение $e) {
echo $e->getMessage();
эхо "н
н";
// Здесь некоторые катастрофические меры
}
?>
В приведенном выше примере мы использовали «try» для выполнения оператора в фигурных скобках. При возникновении ошибки код передает ошибку в предложение «catch» для обработки. В предложении «catch» вам необходимо указать. Обработка ошибок объекта может сделать структуру кода более понятной, поскольку теперь мы можем передать всю информацию об ошибках объекту для обработки.
Пользовательская обработка ошибок
Вы можете легко контролировать аварии в своей программе с помощью специального кода обработки ошибок. Вам просто нужно создать собственный класс контроля ошибок из класса исключений. В вашем собственном классе контроля ошибок вам понадобится конструктор и метод getMessage. Ниже приведен пример.
Пример 13: Пользовательская обработка ошибок
класс WeirdProblem расширяет исключение {
частные $данные;
функция WeirdProblem($data) {
родитель::исключение();
$this->данные = $данные;
}
функция getMessage() {
return $this->data "вызвало странное исключение!";
}
}
?>
Теперь мы можем использовать «throw new WeirdProblem($foo)», чтобы вызвать обработчик ошибок. Если ошибка возникает в блоке кода «try», PHP5 автоматически передаст ошибку в часть «catch» для обработки.
Пространства имен.
Пространства имен полезны для группировки классов или функций. Он может группировать некоторые связанные классы или функции для удобного вызова позже.
Пример 14: Пространство имен
пространство имен Math {
класс Комплекс {
//...код...
функция __construct() {
Печать("Эй");
}
}
} $m = новый Math::Complex();
?>
Обратите внимание на обстоятельства, при которых вам необходимо использовать пространства имен. В практических приложениях вам может потребоваться объявить два или более объектов с одинаковым именем для выполнения разных действий, после чего вы можете поместить их в разные пространства имен (но интерфейс должен быть. одинаковый).