Similar presentations:
ООП в PHP
1. ООП в PHP
Модель объектов в PHP2. Определение класса
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);