ООП в PHP
Определение класса
Определение интерфейса
Пример определения класса
Типы доступа
Динамическое (позднее) связывание
Статическое (раннее) связывание
Конструкторы и деструкторы
Конструкторы клонирования
Подсказки типов
Ключевое слово final
Исключения (exceptions)
Функция автозагрузки классов
Пользовательская перегрузка
Перегрузка установки свойства
Перегрузка чтения свойства
Перегрузка вызова метода
131.00K

ООП в PHP

1. ООП в PHP

Модель объектов в PHP

2. Определение класса

class <Name> [extends <Another_Name>
{
<[Объявления переменных доступа]>
<[Объявления функций доступа]>
}

3. Определение интерфейса

interface Foo
{
function a($foo);
}
class MyFoo implements Foo
{
function a($foo)
{
// ...
}
}

4. Пример определения класса

Class User
{
public $name;
private $password, $lastLogin;
public function __construct($name, $pass)
{
$this->name=$name;
$this->password=$pass;
$this->lastLogin=time();
}
public function getLastLogin()
{
return date(“d M Y”,$this->lastLogin);
}
}
$user = new User(“Me”,”MyPass”);
echo $user->getLastLogin().’<br>\n’;

5. Типы доступа

• Public
• Private
• Protected
• По умолчанию Public

6. Динамическое (позднее) связывание

class Father
{
protected function virt_func() { return ‘This is Father’; }
public function printVirtual()
{
echo $this->virt_func();
}
}
class Son extends Father
{
protected function virt_func() { return ‘This is Son’; }
//public – допустимо, private - нет
}
$obj->new Son();
$obj->printVirtual();

7. Статическое (раннее) связывание

class Father
{
private function own_func() { return ‘This is Father’; }
public function printOwn()
{
echo $this->own_func();
}
}
class Son extends Father
{
private function own_func() { return ‘This is Son’; }
// protected или public тоже допустимо
}
$obj->new Son();
$obj->printOwn();

8. Конструкторы и деструкторы

class Counter
{
private static $count=0;
function __construct()
{
self::$count++;
}
function __destruct()
{
self::$count--;
}
static function getCount()
{
return self::$count;
}
}
$c1=new Counter();
echo Counter::getCount(); //1
$c2=new Counter();
echo Counter::getCount(); //2
$c1=NULL;
echo Counter::getCount(); //1

9. Конструкторы клонирования

class MyCloneable
{
public static $id = 0;
public $id;
public $name;
function MyCloneable($name)
{
$this->id = self::$id++;
$this->name = $name;
}
function __clone()
{
$this->name = ‘Копия ’.$that->name;
$this->id = self::$id++;
}
}
$obj = new MyCloneable(‘Serg’);
print $obj->id . "\n";
print $obj->name . "\n";
$obj = $obj->__clone();
print $obj->id . "\n";
print $obj->name . "\n";

10. Подсказки типов

interface Foo {
function a(Foo $foo);
}
interface Bar {
function b(Bar $bar);
}
class FooBar implements Foo, Bar {
function a(Foo $foo) {
// ...
}
function b(Bar $bar) {
// ...
}
}
$a = new FooBar;
$b = new FooBar;
$a->a($b);
$a->b($b);

11. Ключевое слово final

Элементы и методы, в объявлении которых указано ключевое слово
"final", нельзя переопределить в классе-потомке.
class Foo
{
final function bar()
{
// ...
}
}
Указание запрета наследования
final class Foo
{
// определение класса
}
// следующая строка вызовет ошибку времени выполнения
// class Bork extends Foo {}

12. Исключения (exceptions)

class MyException extends Exception {
function Display() {
print "MyException: $this->exception\n";
}
}
class MyExceptionFoo extends MyException {
function __construct($exception) {
$this->exception = $exception;
}
function Display() {
print "MyException: $this->exception\n";
}
}
try {
throw new MyExceptionFoo('Hello');
}
catch (MyException $exception) {
$exception->Display();
}
catch (Exception $exception) {
echo $exception;
}

13. Функция автозагрузки классов

Функция __autoload() вызывается
автоматически в случае, когда происходит
попытка создания неопределенного класса.
Имя класса передается функции __autoload()
в качестве единственного аргумента.
function __autoload($className) {
include_once $className . ".php";
}
$object = new ClassName;

14. Пользовательская перегрузка

• Перегрузка вызовов метода и
доступа к свойствам
• Как вызовы методов, так и операции
доступа к свойствам могут быть
перегружены с использованием
методов __call(), __get() и __set().

15. Перегрузка установки свойства

class Setter {
public $n;
public $x = array("a" => 1, "b" => 2, "c" => 3);
function __set($nm, $val) {
print "Setting [$nm] to $val\n";
if (isset($this->x[$nm])) {
$this->x[$nm] = $val;
print "OK!\n";
} else {
print "Not OK!\n";
}
}
}

16. Перегрузка чтения свойства

class Setter {
public $n;
public $x = array("a" => 1, "b" => 2, "c" => 3);
function __get($nm) {
print "Getting [$nm]\n";
if (isset($this->x[$nm])) {
$r = $this->x[$nm];
print "Returning: $r\n";
return $r;
} else {
print "Nothing!\n";
}
}
}

17. Перегрузка вызова метода

class Caller {
var $x = array(1, 2, 3);
function __call($m, $a) {
print "Method $m called:\n";
var_dump($a);
return $this->x;
}
}
$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
English     Русский Rules