Martin Kruliš This is an Object Oriented system. If we change something, the users object. 12. 3....

Post on 12-Jan-2016

213 views 0 download

Tags:

Transcript of Martin Kruliš This is an Object Oriented system. If we change something, the users object. 12. 3....

by Martin Kruliš (v1.0) 1

Object Oriented PHPMartin Kruliš

This is an Object Oriented system.If we change something, the users

object.

12. 3. 2015

by Martin Kruliš (v1.0) 2

First attempt made in PHP 4◦ Poor design, failed

Current implementation in PHP 5◦ Design is inspired by languages like Java or C#◦ Adaptations for interpreted type-free language

E.g., there are no “virtual” methods◦ Powerful in combination with PHP-specific features

For instance with variable variables:

$obj = new $className();$obj->$methodName();

12. 3. 2015

Object Oriented PHP

by Martin Kruliš (v1.0) 3

class Foo { public $var = 0; // a member variable public function bar() { // a method echo $this->var; }}

$instance = new Foo(); // create new instance$instance->var = 42;$instance->bar();$instance = null;

12. 3. 2015

Syntax Basicsmember visibility

by Martin Kruliš (v1.0) 4

Member Visibility Type (is mandatory)◦ public – accessible from anywhere◦ protected – access. from within and derived

classes◦ private – only accessible from within the class

Implicit Member Declaration◦ Created as public by defaultclass Foo { private $bar;}$foo = new Foo();$foo->bar = 1; // Error! 'bar' is private$foo->barbar = 42; // OK, new member is created

12. 3. 2015

Member Variables

by Martin Kruliš (v1.0) 5

Visibility Type◦ The same meaning as for variables◦ Optional, set as public if missing

Accessing the Object Instance◦ Current object instance is available through $this◦ It must be used to access member variables

To distinguish members from local variables

No Overloading◦ Same as for functions (incl. variable arguments)

12. 3. 2015

Member Functions (Methods)

by Martin Kruliš (v1.0) 6

Standard Inheritance Model◦ Each class may have only one parent class

Multi-inheritance is achieved by interfaces and traits Overriding Methods

◦ All methods act as if they are virtual◦ parent::method() – calling overridden version

AncestorClass::method() – calling explicit version◦ Methods tagged as final cannot be overridden

class MyFoo extends Foo { public function Bar() { parent::Bar();} }

12. 3. 2015

Inheritance

by Martin Kruliš (v1.0) 7

Special Method __construct()◦ Used to initialize the object◦ Called automatically (by the new operator)◦ May have arguments

Same behavior as regular method (e.g., no overloading)

◦ Does not have to be defined Parent’s constructor or implicit constructor is used

◦ Parent’s constructor is not called implicitly◦ Constructor should be public

Except for some special cases like Singleton or Factory Method design patterns

12. 3. 2015

Constructor

by Martin Kruliš (v1.0) 8

Special Method __destruct()◦ Called when the object is garbage-collected

When ref. count reaches 0 or at the end of the script◦ Does not have to be defined

Parent’s destructor or implicit destructor is used◦ Destructor should not throw exceptions

Since they may not be handled properly◦ Parent’s destructor is not called implicitly◦ Destructor should be public

And there are no reasonable exceptions

12. 3. 2015

Destructor

Example 1

by Martin Kruliš (v1.0) 9

Member Variables with Constant Values◦ Declared by const prefix◦ No visibility declaration, treated as public◦ Accessed from class using :: operator

By class name or by self identifier from within

class Foo { const BAR = 42; function echoBar() { echo self::BAR; }}

echo Foo::BAR;

12. 3. 2015

Member Constants

by Martin Kruliš (v1.0) 10

Static (Class) Members◦ Declared by static keyword before the member◦ Accessed by :: operator (like constants)

E.g., MyClass::$statVar or MyClass::myFunc()◦ One instance, no matter how many objects class

has I.e., static methods does not have $this

◦ The same types of visibility as regular members◦ Small differences in inheritanceclass A { static public $x; }class B extends A { static public $x; }class C extends A {} … C::$x = 42;

12. 3. 2015

Static Members

new variable

same as A::$xExample 2

by Martin Kruliš (v1.0) 11

Late Binding for Static Calls◦ When static:: is used instead of self::

class A {    public static function who() { echo __CLASS__; }    public static function test() {        self::who();    }}

class B extends A {    public static function who() { echo __CLASS__; }}

B::test();

12. 3. 2015

Late Static Binding

Prints ‘A’

static::who();

Prints ‘B’

by Martin Kruliš (v1.0) 12

class A {

function foo() {

echo (isset($this)) ? 'dynamic' : 'static';

}

}

class B {

function bar() {

A::foo(); // static call

}

}

A::foo(); // prints 'static'

$obj = new B();

$obj->bar(); // prints 'dynamic'

12. 3. 2015

Small Mind Teaser

This is only a mentalexercise. Do not call

regular methods statically!

by Martin Kruliš (v1.0) 13

Abstract Classes and Methods◦ Prefixed with keyword abstract◦ Abstract class cannot be instantiated◦ Abstract method has no body

It is expected to be implemented in derived class

abstract class AbstractClass { abstract function foo();}class ConcreteClass extends AbstractClass { function foo() { … foo body … }}$obj = new ConcreteClass();

12. 3. 2015

Abstract Entities

by Martin Kruliš (v1.0) 14

Interfaces◦ List of public methods a class must implement◦ Interfaces may be extended like classes

Using the extends operator

interface IFoo { public function bar($goo);}

class Foo implements IFoo { public function bar($goo) { ... }}

12. 3. 2015

Interfaces

by Martin Kruliš (v1.0) 15

Iterating through Member Variables◦ By foreach construct (like through arrays)

Keys are strings with the name of the member Iteration visits only visible members

◦ Custom iteration can be implemented The class must implement interface Traversableclass MyClass {

public $var1 = 1;

public $var2 = 2;

private $var3 = 3;

}

$obj = new MyClass();

foreach ($obj as $key => $value) { ... }

12. 3. 2015

Object Iterators

Example 3

by Martin Kruliš (v1.0) 16

Reference Passing Principle◦ Assignment copies reference, not the object◦ Object copy must be invoked explicitly, by cloning$foo = new Foo(); $foo2 = clone $foo;

Shallow vs. Full Copy◦ Cloning process creates shallow copy◦ Post-cloning operations may be implemented in

method __clone(), which is invoked on the copy

public function __clone() { $this->innerObj = clone $this->innerObj;}

12. 3. 2015

Object Cloning

Example 4

by Martin Kruliš (v1.0) 17

Member Variables Accessors◦ __get() – control read-access to members◦ __set() – control write-access to members◦ __isset() – isset() override for members◦ __unset() – unset() override for members◦ Overrides only access to member variables, which

are not declared or not visible Declared variables are accessed directly

◦ Only for regular members, not for static

12. 3. 2015

Magic Methods

by Martin Kruliš (v1.0) 18

Method Invocation Override◦ __call() – intercepts calls to not visible methods◦ __callStatic() – the same for static methods◦ __invoke() – when object is called as function

Object (De)Serialization◦ __sleep() – invoked when the object is being

serialized (to a persistent storage)◦ __wakeup() – invoked when the object is being

deserialized (from a persistent storage)◦ __toString() – returns string representation of

the object (e.g., so it can be printed)

12. 3. 2015

Magic Methods

Example 5

PHP 5.4

by Martin Kruliš (v1.0) 19

Reference Comparison Behavior◦ $object1 == $object2

True if both object are of the same class and all member variables are equal (==)

◦ $object1 === $object2 True if both variables hold a reference to exactly the

same object◦ Behavior of != and !== operators can be easily

extrapolated

12. 3. 2015

Comparing Objects

by Martin Kruliš (v1.0) 20

Controlling Types of Function Arguments◦ Function (method) arguments may be prefixed with

Class/interface ~ the argument must be an object of that class, derived class, or it must implement the interface

array keyword ~ the argument must be an array callable keyword ~ the argument must be invokeable

I.e., function, or object with __invoke() method

◦ The type of the calling argument is enforced Noncompliance triggers PHP fatal error

function foo(MyClass $obj, array $params) { ... }

12. 3. 2015

Type Hinting

PHP 5.4

by Martin Kruliš (v1.0) 21

Operator instanceof◦ Verifies whether object is an instance of given

class or derived class, or implements given interfaceif ($foo instanceof FooClass) ...

Functions Testing Types◦ get_class() – returns class name as string◦ get_parent_class() – name of the parent class◦ is_a() – verifies that object is of given class◦ is_subclass_of() – like is_a(), but checks also

derived classes

12. 3. 2015

Type Detection/Verification

by Martin Kruliš (v1.0) 22

Traits◦ Class-like mechanism for code reuse

Horizontal composition of behavior (similar to Mixins)◦ Trait

Special class that cannot be instantiated May contain both member variables and methods

It can be added to regular classes

trait SayHello { public function helloWorld() { echo 'Hello World'; }}class myClass { use SayHello; ...

12. 3. 2015

TraitsPHP 5.4

by Martin Kruliš (v1.0) 23

Testing Existence◦ class_exists(), interface_exists()◦ method_exists()

Listings◦ get_declared_classes(), get_declared_interfaces()◦ get_class_methods()◦ get_object_vars()◦ get_class_vars()

Indirect Method Callscall_user_func_array(array($obj, 'methodName'), $params);

12. 3. 2015

Related Functions

by Martin Kruliš (v1.0) 25

Automatic Loading of Classes◦ Useful for libraries, reduces the number of

includes◦ Global function __autoload()

spl_autoload_register() register multiple handlers

function __autoload($className) { include 'libs/' . $className . '.php';}

function __autoload($className) { log("Class $className is not defined!");}

12. 3. 2015

Autoloading

by Martin Kruliš (v1.0) 26

Namespaces◦ Another way how to encapsulate space of

identifiers Affect classes, traits, interfaces, functions, constants Similar to directories and files

◦ Declaration: namespace identifier; First statement in the file Identifier may be hierarchical (separator is

backslash)◦ Dereferencing

myClass -> currentNS\myClass name\space\myClass -> currentNS\name\space\myClass \name\space\myClass – absolute path, no modifications

◦ Aliasing – use identifier [as identifier];12. 3. 2015

Namespaces

by Martin Kruliš (v1.0) 27

Custom Iterators◦ The foreach construct is powerful

But it iterates over structures (arrays and objects)◦ Custom iterator can be built (Iterator interface)

Both memory demanding and tedious◦ Generator is a function that yields values

It can be used in foreach construct

function my_generator($n) { for ($i = 0; $i < $n; ++$i) yield $i;}

foreach (my_generator(42) as $value) ...

12. 3. 2015

Generators

Returns next value

Local context is preserved

PHP 5.5

by Martin Kruliš (v1.0) 2812. 3. 2015

Discussion