PHP объектно-ориентированное программирование
Вступление
Объектно-ориентированное программирование - это подход к программированию, в котором используются объекты и классы. Современные Java и C ++ в основном используются для объектно-ориентированного программирования. В PHP 4 была ограниченная область объектно-ориентированного программирования, но в PHP 5 объектная модель была переписана для лучшей производительности и большего количества функций. Теперь PHP 5 имеет полную объектную модель.
Содержание:
- Объект, классы
- PHP: создание классов и создание экземпляров
- Настройка свойств
- Методы настройки
- PHP: Оператор разрешения области (: :)
- PHP: константы класса
- Понимание государственных, частных, охраняемых объектов
- Понимание публичных, частных, защищенных методов
- PHP: методы конструктора
- PHP: методы деструкторов
- PHP: использование нескольких экземпляров одного класса
- PHP: spl_autoload_register ()
- PHP: наследование
- PHP: интерфейсы
- PHP: клонирование объектов
- PHP: магические методы
Что такое объект?
Фундаментальная идея объектно-ориентированного языка состоит в том, чтобы объединить набор переменных и функций в единый модуль и защитить как переменные, так и функции от внешнего вмешательства и злоупотребления. Такая единица называется объектом, который действует на данные. Механизм, который связывает воедино данные и функции, называется инкапсуляцией. Эта функция облегчает повторное использование кода в различных проектах. Функции, объявленные в объекте, обеспечивают способ доступа к данным. Функции объекта называются методами, и все методы объекта имеют доступ к переменным, называемым свойствами.
На следующем рисунке показаны компоненты объекта.
Учебный класс
В объектно-ориентированном программировании класс - это конструкция или прототип, из которого создаются объекты. Класс определяет составные члены, которые позволяют экземплярам класса иметь состояние и поведение. Члены поля данных позволяют объекту класса поддерживать состояние, а методы - поведение объекта класса. На следующем рисунке показаны компоненты класса.
PHP: создание классов и создание экземпляров
- Определение класса начинается с ключевого слова class, за которым следует имя класса, затем следует набор фигурных скобок ( {} ), которые заключают в себе константы, переменные (называемые «свойствами») и функции (называемые «методами»), принадлежащие классу. ,
- Допустимое имя класса (исключая зарезервированные слова) начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркиваний.
- Имена классов обычно начинаются с заглавной буквы, чтобы отличать их от других идентификаторов.
- Экземпляр - это объект, который был создан из существующего класса.
- Создание объекта из существующего класса называется созданием объекта.
- Чтобы создать объект из класса, необходимо использовать новое ключевое слово.
- Классы должны быть определены до создания экземпляра.
Пример:
<?php
class Myclass
{
// Add property statements here
// Add the methods here
}
?>
В следующем примере ключевое слово new используется для создания экземпляра объекта. Здесь $ myobj представляет объект класса Myclass.
<?php
$myobj = new MyClass;
?>
Давайте посмотрим содержимое класса Myclass с помощью функции var_dump () (отобразить структурированную информацию (тип и значение) об одной или нескольких переменных):
<?php
class Myclass
{
// Add property statements here
// Add the methods here
}
$myobj = new MyClass;
var_dump($myobj);
?>
Выход:
объект (Myclass) # 1 (0) {}
Настройка свойств
- Переменные-члены класса называются свойствами. Иногда они упоминаются как атрибуты или поля.
- Свойства содержат конкретные данные и связаны с классом, в котором они были определены.
- Объявление свойства в классе - простая задача, используйте одно из ключевых слов public, protected или private, за которым следует обычное объявление переменной. Если объявлено с использованием var (совместимость с PHP 4), свойство будет определено как public.
- public: свойство может быть доступно извне класса, либо скриптом, либо из другого класса
- private: доступ не предоставляется извне класса ни сценарием, ни другим классом.
- protected: доступ не предоставляется извне класса, кроме класса, который является дочерним по отношению к классу с защищенным свойством или методом.
- nowdocs (начиная с PHP 5.3.0) можно использовать в любом контексте статических данных, включая объявления свойств.
Пример:
После создания объекта вы можете получить доступ к свойству класса, используя объект и оператор -> . Любой член, объявленный с ключевым словом "private" или "protected", не может быть доступен вне метода класса.
<?php
class Myclass
{
public $font_size =10;
}
$f = new MyClass;
echo $f->font_size;
?>
Выход:
10
Примечание. Распространенной ошибкой является использование более одного знака доллара при доступе к переменным. В приведенном выше примере не будет знака $ перед font_size ( echo $ f-> font_size ).
После определения методов мы обсудим пример со свойствами открытого, закрытого и защищенного классов.
Методы настройки
- Функции, которые объявлены в классе, называются методами.
- Метод класса в точности похож на функции PHP.
- Объявление метода в классе - простая задача, используйте одно из ключевых слов public, protected или private, за которым следует имя метода.
- public: к методу можно получить доступ снаружи класса.
- private: доступ вне класса не предоставляется.
- protected: доступ не предоставляется извне класса, кроме класса, который является дочерним по отношению к классу с защищенным свойством или методом.
- Допустимое имя метода начинается с буквы или подчеркивания, за которым следует любое количество букв, цифр или подчеркивания.
- Тело метода заключено в пару фигурных скобок, которые содержат коды. Открывающая фигурная скобка ({) указывает начало кода метода, а закрывающая фигурная скобка (}) указывает на завершение метода.
- Если метод не определен как общедоступный, защищенный или частный, то по умолчанию это общедоступный.
- Может получить доступ к свойствам и методам текущего экземпляра, используя $ this (Format $ this-> property) для не статического свойства.
Пример:
После создания объекта вы можете получить доступ к методу класса, используя объект и оператор -> . В следующем примере метод customize_print () напечатает строку с определенным размером и цветом шрифта в элементе HTML-абзаца с помощью оператора php echo.
<?php
class Myclass
{
public $font_size ="18px";
public $font_color = "blue";
public $string_name = "w3resource";
public function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_name."</p>";
}
}
$f = new MyClass;
echo $f->customize_print();
?>
Выход:
Теперь измените значение font_size, font_color и строки и проверьте, что возвращает метод custimize_print () .
<?php
class Myclass
{
public $font_size ="18px";
public $font_color = "blue";
public $string_name = "w3resource";
public function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_name."</p>";
}
}
$f = new MyClass;
$f->font_size = "20px";
$f->font_color = "red";
$f->string_name = "Object Oriented Programming";
echo $f->customize_print();
?>
Выход:
PHP: Оператор разрешения области (: :)
В PHP оператор разрешения контекста также называется Paamayim Nekudotayim, что означает «двойное двоеточие» или «двойная точка дважды» на иврите. Двойное двоеточие (: :) - это токен, который обеспечивает доступ к статическим, постоянным и переопределенным свойствам или методам класса.
PHP: константы класса
- Специальный объект, который остается фиксированным на индивидуальной основе класса.
- Именам констант не предшествует знак доллара ($), как в обычном объявлении переменной.
- Интерфейсы могут также включать константы.
- При вызове константы класса с использованием синтаксиса $ classname :: constant имя класса может фактически быть переменной.
- Начиная с PHP 5.3, вы можете получить доступ к статической константе класса, используя ссылку на переменную (Пример: className :: $ varConstant).
Определите и используя постоянную
<?php
class MyClass
{
const constant1 ='PHP Class Constant';
function PrintConstant()
{
echo self::constant1 . "<br>";
}
}
echo MyClass::constant1 . "<br>";
$classname = "MyClass";
echo $classname::constant1 . "<br>"; // As of PHP 5.3.0
$class = new MyClass();
$class->PrintConstant();
echo $class::constant1."<br>"; // As of PHP 5.3.0
?>
Понимание государственных, частных, охраняемых объектов
Недвижимость может быть публичной, частной или защищенной. Открытый означает, что к свойствам можно получить доступ везде, частные - к свойствам - к классу, который определяет член, а к защищенным - к свойствам можно обращаться только внутри самого класса, а также унаследованных и родительских классов.
Пример:
<?php
// Define a class
class Myclass
{
// Declare $font_size as Public property
public $font_size ="18px";
// Declare $font_color as Private property
private $font_color = "blue";
// Declare $string_name as Protected property
protected $string_name = "w3resource";
// Declare a method to print properties value. This is public.
function property_print()
{
echo $this->font_size;
echo $this->font_color;
echo $this->string_name;
}
}
$obj = new MyClass;
echo $obj->font_size; //Display 18px
echo $obj->font_color; //Fatal error: Cannot access private property Myclass::$font_color in F:\wamp\..
echo $obj->string_name; //Fatal error: Cannot access protected property Myclass::$string_name in F:\wamp\..
$obj->property_print(); //Display 18pxbluew3resource
?>
Понимание публичных, частных, защищенных методов
Методы могут быть публичными, частными или защищенными. Публичный означает, что к методам можно получить доступ повсюду, частные средства означают, что методы могут быть доступны классу, который определяет член, а методы защищенных средств могут быть доступны только внутри самого класса и унаследованных и родительских классов.
<?php
// Define a class
class Myclass
{
// Declare a public method
public function my_public_method()
{
echo "This is a Public method";
}
private function my_private_method()
{
echo "This is a Private method";
}
protected function my_protected_method()
{
echo "This is a Protected method";
}
// This is public
function test()
{
$this->my_public_method();
$this->my_private_method();
$this->my_protected_method();
}
}
$obj = new MyClass;
$obj->my_public_method(); //Display This is a Public method
$obj->my_private_method();//Fatal error: Call to private method Myclass::my_private_method() from context '' in F:\wamp\www..
$obj>my_protected_method();//Fatal error: Call to undefined function my_protected_method() in F:\wamp\www..
$obj->test(); //Display This is a Public methodThis is a Private methodThis is a Protected method
?>
Примечание: PHP использует наследование в своей объектной модели, и когда вы расширяете класс, подкласс наследует все открытые и защищенные методы от родительского класса. Когда мы обсудим наследование, вы получите больше информации о защищенных свойствах и методах.
Методы конструктора PHP
- Конструктор - это специальный встроенный метод, добавленный в PHP 5, позволяющий разработчикам объявлять для классов.
- Конструкторы позволяют инициализировать свойства объекта (то есть значения свойств) при создании объекта.
- Классы, которые имеют метод конструктора, выполняются автоматически при создании объекта.
- Метод construct начинается с двух подчеркиваний (__).
- Конструктор не требуется, если вы не хотите передавать какие-либо значения свойств или выполнять какие-либо действия при создании объекта.
- PHP всегда вызывает только один конструктор.
Общий синтаксис объявления конструктора следующий:
функция __construct ([аргумент1, аргумент2, ..., аргументN])
{
/ * Код инициализации класса * /
}
Тип аргумента 1, аргумент 2, ......., аргумент N являются смешанными.
Пример:
<?php
// Define a class
class Myclass
{
// Declaring three private varaibles
private $font_size;
private $font_color;
private $string_value;
// Declarte construct method which accepts three parameters
function __construct($font_size,$font_color,$string_value)
{
$this->font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
}
// Declare a method for customize print
function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_value."</p>";
}
}
// Create a new object and passes three parameters
$f = new MyClass('20px','red','Object Oriented Programming');
// Call the method to display the string
echo $f->customize_print();
?>
Выход:
Еще пример по конструкторам:
Как и свойства, конструкторы могут вызывать методы класса или другие функции. В следующем примере нет необходимости вызывать метод отдельно (после создания объекта и передачи параметров, см. Предыдущий пример), так как он уже объявлен в конструкторе. Смотрите следующий пример:
<?php
// Define a class
class Myclass
{
// Declaring three private variables
private $font_size;
private $font_color;
private $string_value;
// Declarte construct method which accepts three parameters and the method customize_print()
function __construct($font_size,$font_color,$string_value)
{
$this->font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print();
}
// Declare a method for customize print
function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_value."</p>";
}
}
// Create a new object and passes three parameters
$f = new MyClass('20px','red','Object Oriented Programming');
?>
Выход:
Методы деструкторов PHP
- Деструктор является аналогом конструктора.
- Функция деструктора вызывается при уничтожении объекта
- Функция деструктора очищает любые ресурсы, выделенные объекту после уничтожения объекта.
- Функция деструктора обычно вызывается двумя способами: когда скрипт завершается или вручную удаляет объект с помощью функции unset ()
- Метод «деструктор» начинается с двух подчеркиваний (__).
Общий синтаксис объявления деструктора следующий:
функция __destruct
{
/ * Код инициализации класса * /
}
Тип аргумента 1, аргумент 2, ......., аргумент N являются смешанными.
Пример:
<?php
// Define a class
class MyClass
{
function __construct()
{
echo 'w3resource'.'<br>';
$this->name = "MyClass";
}
function __destruct()
{
echo "Destroying " . $this->name . "<br>";
}
}
$obj = new MyClass();
?>
Выход:
w3resource Уничтожение MyClass
PHP: использование нескольких экземпляров одного класса
В следующем примере мы создали несколько объектов (экземпляров) одного класса и передали разные значения.
<?php
// Define a class
class Myclass
{
// Declaring three private varaibles
private $font_size;
private $font_color;
private $string_value;
// Declarte construct method which accepts three parameters and the method customize_print()
function __construct($font_size,$font_color,$string_value)
{
$this->font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print();
}
// Declare a method for customize print
function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_value."</p>";
}
}
// Create first object and passes three parameters
$a = new MyClass('30px','red','Object Oriented Programming');
// Create second object and passes three parameters
$b = new MyClass('25px','blue','Object Oriented Programming');
// Create third object and passes three parameters
$c = new MyClass('20px','green','Object Oriented Programming');
// Create fourth object and passes three parameters
$d = new MyClass('15px','black','Object Oriented Programming');
?>
Выход:
PHP: spl_autoload_register ()
Многие разработчики, пишущие объектно-ориентированные приложения, создают один исходный файл PHP для каждого определения класса. Одним из самых больших неудобств является необходимость написания длинного списка необходимых включений в начале каждого сценария (по одному для каждого класса). Традиционно функция __autoload () использовалась для автоматической загрузки классов. В PHP 5.1.2 введена новая функция spl_autoload_register (), которая предоставляет более гибкую альтернативу для автозагрузки классов. По этой причине использование __autoload () не рекомендуется и может быть признано устаревшим или удалено в будущем.
Синтаксис:
bool spl_autoload_register ([вызываемая $ autoload_function [, bool $ throw = true [, bool $ prepend = false]]])
параметр
название | Описание |
---|---|
autoload_function | Функция автозагрузки регистрируется. Если параметр не указан, то по умолчанию будет реализована реализация spl_autoload (). |
бросать | Этот параметр указывает, должна ли функция spl_autoload_register () генерировать исключения, когда функция autoload_function не может быть зарегистрирована. |
перед именем | Если это правда, spl_autoload_register () будет предшествовать автозагрузчику в стеке автозагрузки, а не добавлять его. |
Возвращаемые значения
Возвращает TRUE в случае успеха или FALSE в случае неудачи.
Вы можете использовать функцию spl_autoload_register () следующим образом:
<?php
spl_autoload_register(function ($class)
{
include 'classes/' . $class . '.class.php';
});
?>
Пример:
Сначала мы создадим два класса и сохраним их в / php / classes-objects / resource path:
class1.php
<?php
// Define a class
class class1
{
// Declaring two private varaibles
private $font_color;
private $string_value;
// Declarte construct method which accepts two parameters and the method customize_print1()
function __construct($font_color,$string_value)
{
$this->font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print1();
}
// Declare a method for customize print
function customize_print1()
{
echo "<p style=color:".$this->font_color.";>".$this->string_value."</p>";
}
}
?>
class2.php
<?php
// Define a class
class class2
{
// Declaring two private varaibles
private $font_size;
private $string_value;
// Declarte construct method which accepts two parameters and the method customize_print2()
function __construct($font_size,$string_value)
{
$this->font_size = $font_size;
$this->string_value = $string_value;
$this->customize_print2();
}
// Declare a method for customize print
function customize_print2()
{
echo "<p style=font-size:".$this->font_size.";>".$this->string_value."</p>";
}
}
?>
Теперь создайте файл printstring.php и сохраните его в / php / classes-objects:
<?php
spl_autoload_register(function ($class)
{
include '../../php/classes-objects/resource/'.$class.'.php';
});
$print1 = new class1('red','Object Oriented Programming');
$print2 = new class2('20px','Object Oriented Programming');
?>
В приведенном выше примере мы пытаемся создать два объекта, где имена классов «class1» (сохранить в /php/classes-objects/resource/class1.php) и «class2» (сохранить в / php / classes-objects / resource / class2.php). PHP передает это имя в виде строки в spl_autoload_register (), которая позволяет вам выбрать переменную и использовать ее для «включения» соответствующего класса / файла.
Выход:
PHP: наследование
- Наследование - это устоявшийся принцип программирования.
- Наследование позволяет классам формировать иерархию, подобную генеалогическому дереву.
- Позволяет подклассам совместно использовать методы и свойства (открытые или защищенные) своего суперкласса.
- Суперкласс является родительским классом.
- Подкласс может добавлять свойства и методы.
- Наследование позволяет повторно использовать код.
Пример:
В следующем примере подкласса «Mysubclass» наследует все защищенные свойства и открытый метод от класса «Myclass». Кроме того, мы добавляем атрибут украшения текста в оператор echo в подклассе «Mysubclass».
<?php
// Define a class
class Myclass
{
// Declaring three protected varaibles
protected $font_size;
protected $font_color;
protected $string_value;
// Declarte construct method which accepts three parameters and the method customize_print()
function __construct($font_size,$font_color,$string_value)
{
$this->font_size = $font_size;
$this->font_color = $font_color;
$this->string_value = $string_value;
$this->customize_print();
}
// Declare a method for customize print
public function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";>".$this->string_value."</p>";
}
}
// Define a subclass
class Mysubclass extends Myclass
{
// Call the method customize print() and add the text decoration attribute within echo statement
public function customize_print()
{
echo "<p style=font-size:".$this->font_size.";color:".$this->font_color.";text-decoration:underline;>".$this->string_value."</p>";
}
}
// Create objects and passes parameters
$p = new Myclass('20px','red','Object Oriented Programming');
$s = new Mysubclass('15px','green','Object Oriented Programming');
?>
Выход:
PHP: интерфейсы
- Предоставляет методы для реализации.
- Производные классы могут реализовывать более одного интерфейса.
- Интерфейсы могут наследоваться от других интерфейсов, используя ключевое слово extends.
- Предполагается, что все методы являются общедоступными, в определении интерфейса могут быть определены явно как публичные или неявно.
- Когда класс реализует несколько интерфейсов, не может быть никакого конфликта именования между методами, определенными в разных интерфейсах.
Синтаксис:
интерфейс MyInterface { функция method1 (); функция method2 (); } класс MyClass реализует MyInterface { функция method1 () { // определение method1 } функция method2 () { // определение method2 } }
PHP: клонирование объектов
- Клонирование используется для создания копии объекта.
- Копия объекта создается с помощью ключевого слова clone .
- Когда объект клонируется, PHP 5 выполнит поверхностную копию всех свойств объекта.
- Любые свойства, которые являются ссылками на другие переменные, останутся ссылками.
- PHP предоставляет специальный метод __clone для копирования объекта.
- После завершения клонирования, если определен метод __clone (), будет вызван метод вновь созданного объекта __clone (), чтобы разрешить любые необходимые свойства, которые необходимо изменить.
Пример:
В PHP клонирование объектов осуществляется с помощью ключевого слова clone . Вот пример клонирования объекта:
Пример: клонирование объекта с помощью магического метода __clone
<?php
class MyClass
{
public $x;
private $y;
function __construct($x, $y)
{
$this->
x = $x;
$this->
y = $y;
}
function __clone()
{
$this->x = "z";
}
}
$a = new MyClass("w3resource", "com"); // create a new object
$b = clone $a; //clone of the object
var_dump($a);
echo '<br>';
var_dump($b);
?>
Выход:
object (MyClass) # 1 (2) {["x"] => string (10) "w3resource" ["y": "MyClass": private] => string (3) "com"} object (MyClass) # 2 (2) {["x"] => string (1) "z" ["y": "MyClass": private] => string (3) "com"}
PHP: магические методы
Имена функций __construct (), __destruct (), __call (), __callStatic (), __get (), __set (), __isset (), __unset (), __sleep (), __wakeup (), __toString (), __invoke () , __set_state () и __clone () магические в классах PHP. PHP резервирует все имена функций, начинающиеся с __, как магические.
Мы уже обсуждали методы __construct (), __destruct () и __clone ().
Вот другие магические методы:
__вызов()
__call () запускается при вызове недоступных методов в контексте объекта.
Синтаксис: public mixed __call (строка $ name, массив $ arguments)
__callStatic ()
__callStatic () срабатывает при вызове недоступных методов в статическом контексте.
Синтаксис: public mixed __call (строка $ name, массив $ arguments)
__получить()
__get () используется для чтения данных из недоступных свойств.
Синтаксис: public mixed __get (строка $ name)
__задавать()
__set () запускается при записи данных в недоступные свойства.
Синтаксис: public void __set (строка $ name, смешанное значение $)
__isset ()
__isset () вызывается вызовом isset () или empty () для недоступных свойств.
Синтаксис: public bool __isset (строка $ name)
__unset ()
__unset () вызывается, когда unset () используется для недоступных свойств.
Синтаксис: public void __unset (строка $ name)
__спать()
__sleep () используется для фиксации ожидающих данных или выполнения аналогичных задач очистки. Кроме того, эта функция полезна, если у вас есть очень большие объекты, которые не нужно сохранять полностью.
Синтаксис: открытый массив __sleep (void)
__просыпайся()
__wakeup () используется для восстановления любых соединений с базой данных, которые могли быть потеряны во время сериализации, и выполнения других задач повторной инициализации.
Синтаксис: void __wakeup (void)
__нанизывать()
Метод __toString () позволяет классу решить, как он будет реагировать, когда обрабатывается как строка.
Синтаксис: открытая строка __toString (void)
__invoke ()
Метод __invoke () вызывается, когда скрипт пытается вызвать объект как функцию.
Синтаксис: смешанный __invoke ([$ ...])
__set_state ()
Этот статический метод вызывается для классов, экспортируемых var_export () начиная с PHP 5.1.0.
Синтаксис: статический объект __set_state (массив $ properties)
Мы приведем несколько примеров магических методов в ближайшее время.
Предыдущая: PHP User Define Function
Далее: PHP PDO
Новый контент: Composer: менеджер зависимостей для PHP , R программирования